Managed (C#) Methoden aus Unmanaged DLL (C++) aufrufen - geht das?
-
Guten Abend Community
Ich habe hier eine C# App und verwende an vielen Stellen native, unmanaged C++ DLLs. Nach meinem Wissensstand gehen in diesem Fall die Calls nur in eine Richtung, also C# -> C++. Ist es überhaupt möglich, irgendwie, eine C# <-> C++ Verbindung herzustellen um z.B. eine C# Methode als Callback für eine C++ Funktion zu verwenden oder public Felder zu verändern?
Wenn generell ein 'Nein' die Antwort ist, isses auch net so schlimm.
So, das's die grundlegende Frage, und wen's im Detail interessiert, der lese jetzt weiter
Ich hab' eine WPF Applikation mit C# als Code-Behind, der größte Teil der Programmlogik wird aber von C/C++ verarbeitet. Das sieht dann so aus, dass ich im C# Programm die DLLs marshale, und um zu gewährleisten, dass die DLLs untereinander auch brav miteinander kommunizieren können, und vor Allem nicht jedesmal 'ne DLL neu laden, hole ich mir dort 'nen Handle auf eben eine bereits geöffnete DLL die bereits im Memory Space des Prozesses liegt (mit den WinAPI Funktionen GetModuleHandle() und GetProcAddr()). Funktioniert soweit auch wie geschmiert. Das i-Tüpfelchen wäre jetzt eben nur, dass meine DLLs an einigen Stellen eben auf die ein oder andere C# Methode zugreifen können um z.B. die GUI zu beinflussen.
Hoffe das war einigermaßen verständlich^^
Ideen?
Gruß
PuerNoctisEDIT: Was ich bräuchte vlt. wäre die Möglichkeit einen C# delegate als Argument an eine C++ Funktion die einen Funktionspointer erwartet zu übergeben.
-
EDIT: Was ich bräuchte vlt. wäre die Möglichkeit einen C# delegate als Argument an eine C++ Funktion die einen Funktionspointer erwartet zu übergeben.
Das ist möglich.
http://lmgtfy.com/?q=C%23+C%2B%2B+callback+p%2Finvoke
Simon
-
Haha, okay, sorry, hätte ich's gleich so ausprobiert hätte ich Euch den Beitrag ersparen können, aber vlt. hilft's ja jemandem:
Mit einem Delegate auf eine statische Methode, braucht man in C++ nur einen 08/15 Funktionspointer mit der selben Signatur erwarten, dann geht's. Beispiel:
// C# public delegate int delMyCallback(); {DllImport("MyCPP.dll")] public static extern int MyCPPFunc(delMyCallback); // Aufruf irgendwo MyCPPFunc(MyCallbackImplementation);
// C++ extern "C"{ int __declspec(dllexport) MyCPPFunc(int(*fn)(void)) { (*fn)(); return SUCCESS; }}
War ja einfacher als gedacht!
Aber falls trotzdem noch jemand was hinzuzufügen hat, Diskussion ist ja noch offenGruß
PuerNoctisEDIT: Danke Theta, hab' Deinen Beitrag gerade gesehen. Wie gesagt, hätte ich egtl. selbst drauf kommen können. War wohl zu ungeduldig mit dem Post, sry