Howto:gcroot<T^> - Managed Klassen in Unmanaged Klassen verwenden
-
Mit Hilfe von gcroot kann man in Unmanaged Klassen Managed Klassen verwenden. So lässt sich z.B. loki::SingleTonHolder verwenden um Fenster in einer MDI Anwendung zu verwalten.
Gegeben sei:
ref class managed_class { public: void test() { MessageBox::Show("TEST"); } };
Mit
gcroot<managed_class^>
lässt sich die Klasse in einer unmanaged Klasse verwenden.
struct unmanaged_class { gcroot<managed_class^> m_t; };
(Gerade wenn man mit Schnittstellen zwischen .net Strings und std::string arbeiten muss, wird man sicherlich das ein oder andere
gcrootSystem::String^ verwenden.)Um zu prüfen ob in m_t überhaupt schon was vorhanden ist, kann man folgendes verwenden:
if(static_cast<managed_class^>(m_t) == nullptr) return; m_t->func();
Und anbei noch eine kleine Beispielanwendung zum spielen und zerlegen:
ref class managed_class { public: void test() { MessageBox::Show("TEST"); } }; template <typename T> struct unmanaged_class { gcroot<T^> m_t; void native_test() { if(static_cast<T^>(m_t) != nullptr) m_t->test(); } }; private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { unmanaged_class<managed_class> * A = new unmanaged_class<managed_class>; A->native_test(); A->m_t = gcnew managed_class; A->native_test(); }