Aufruf verwalteten Code von nicht verwaltetem Code
Frage
Ich mag meinen .NET-Code von nicht verwalteten C ++ nennen. Mein Prozess Einstiegspunkt ist .NET basiert, so dass ich keine Sorgen zu machen über die CLR-Hosting. Ich weiß, kann es mit COM-Wrapper für .NET-Objekten durchgeführt werden, aber ich möchte einzelne statische Methoden von verwalteten Klassen zuzugreifen, so COM ist nicht meine kürzeste / einfachste Weg.
Danke!
Lösung
Sie sprechen über reale unmanaged Code Unter der Annahme - nicht nur native C ++ läuft in einem Mixed-Mode-Montage mit / clr kompiliert - der einfachste Weg ist ein Wrapper auf Ihre .NET-Code in C ++ / CLI zu erstellen. Sie können dann die C ++ / CLI Methoden exportieren, indem nur markiert sie mit __declspec (dllexport).
Alternativ, wenn Sie die Kontrolle über den Aufruf des nicht verwalteten Code haben, können Sie Funktion-Zeiger auf Ihre .NET-Methoden Marschall und sie an den nicht verwalteten Code übergeben.
Andere Tipps
Sehen Sie in dieser Lösung: https://sites.google.com/site/robertgiesecke/Home/uploads/ unmanagedexports Die Lösung ermöglicht durch die Dekoration der Funktion C # Funktion von C aufrufen mit [Dllexport] Attribut (gegenüber von P / Invoke DllImport).
Exmaple:
C # -Code
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C-Code:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
Ausgabe:
The solution is found!!! Z is 15
Aktualisieren : Es ist eine Frage, und eine gute Antwort in den Kommentaren:
Wie füge ich die DLL in dem nicht verwalteten Projekt?
Sie müssen die LIB-Datei verknüpfen, die auf die Erstellung C # -Code ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )
Ich glaube, Sie für Reverse-PInvoke suchen. Wenn Sie für Reverse pinvoke google finden Sie viele hilfreiche Einträge bekommen. Ich denke, die folgenden ein gutes quick and dirty Beispiel hat.
Ihre Telefonvorwahl ist C ++ mit / clr aktiviert. Richtig?
Wenn ja, dann können Sie einfach die Anweisung using verwenden Ihren .NET-DLL in Ihrem Code zu verwenden. So etwas wie:
#using <Mydll.dll>
und dann können Sie einfach die Objekte Ihrer verwalteten Klassen machen wie:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
Wenn Sie dies machen wollen obj ein Datum Mitglied Ihrer Klasse die Verwendung gcroot ist der Weg zu gehen.