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!

War es hilfreich?

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 )

Werfen Sie einen Blick auf die GCHandle Klasse und das gcroot Schlüsselwort, das eine typsichere bietet, als Templat-Wrapper um GCHandle.

Sie können diese verwenden, um einen Verweis auf ein CLR-Objekt zu halten (oder einen Boxed-Wert) in nativen Code.

MSDN hat ein grundlegendes Tutorial hier .

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.

PInvoke -Reverse PInvoke und __stdcall - __cdecl

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top