2008-10-22 15 views
15

Ich möchte meinen .NET-Code aus nicht verwalteten C++ aufrufen. Mein Prozess-Einstiegspunkt ist .NET-basiert, sodass ich mir keine Sorgen über das Hosting der CLR machen muss. Ich weiß, dass es möglich ist, COM-Wrapper für .NET-Objekte zu verwenden, aber ich würde gerne auf einzelne statische Methoden verwalteter Klassen zugreifen, also ist COM nicht meine kürzeste/einfachste Route.Aufruf verwalteten Code aus nicht verwalteten Code

Danke!

+0

möglich Duplikat [Exportieren von DLL-Funktionen auf nicht verwalteten Programme] (http://stackoverflow.com/questions/12647766 erzeugt wird/exporting-dll-functions-to-unmanaged-programs) – Rohit

Antwort

6

Angenommen, Sie sprechen über echten nicht verwalteten Code - nicht nur natives C++, das in einer mit/clr kompilierten Assembly im gemischten Modus ausgeführt wird -, ist die einfachste Möglichkeit, einen Wrapper für Ihren .NET-Code in C++/CLI zu erstellen. Sie können die C++/CLI-Methoden dann exportieren, indem Sie sie einfach mit __declspec (dllexport) markieren.

Wenn Sie Kontrolle über den Aufruf des nicht verwalteten Codes haben, können Sie Funktionszeiger auf Ihre .NET-Methoden marshallen und sie an den nicht verwalteten Code übergeben.

6

Werfen Sie einen Blick auf die Klasse GCHandle und das Schlüsselwort gcroot, das eine typensichere, auf Vorlagen basierende Hülle um GCHandle bietet.

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

MSDN hat ein grundlegendes Lernprogramm here.

+1

Beachten Sie, dass dafür/clr aktiviert sein muss. –

1

Ihr Aufrufcode ist C++ mit/clr aktiviert. Recht?

Wenn ja, können Sie einfach die using-Anweisung verwenden, um Ihre .NET-DLL in Ihrem Code zu verwenden. 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 möchten ein Daten Mitglied Ihrer Klasse obj die Verwendung gcroot ist der Weg gehen.

+0

nützlich, aber er sagte "aus unmanaged C++"./clr verhindert, dass es nicht verwaltet wird. – gbjbaanb

+0

Ich denke, das ist, was er ausdrücklich erwähnt hat. Mein Prozess Einstiegspunkt ist .NET basiert, so muss ich keine Sorgen über das Hosting der CLR Aamir

+0

Er könnte auch gemeint haben, dass er P/Invoking in eine vollständig nicht verwaltete C++ - DLL und möchte wieder in die CLR zurückrufen . –

17

Schauen Sie sich diese 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; 
} 

Output:

The solution is found!!! Z is 15 

Update: Es gibt eine Frage und eine gute Antwort in den Kommentaren:

Wie schließe ich die DLL in das nicht verwaltete 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)

+2

Wie schließe ich die DLL in das nicht verwaltete Projekt ein? Gibt es irgendwo ein Beispielprojekt (z. B. für Visual Studio)? – habakuk

+1

@habakuk Ich weiß, es ist Jahre her, aber ich stelle das hier, damit jemand anderes es in der Zukunft sehen kann. Die Art, wie ich es gemacht habe, war das Kompilieren des .cs-Projekts mit x64/x86. Ich verlinkte dann mit der .lib-Datei, die in meinem nativen C++ - Projekt generiert wurde. In der Header-Datei habe ich die Methodensignatur referenziert: extern "C" { void ExportedMethodName(); } Dann verwendet es normalerweise. – CodingMadeEasy

Verwandte Themen