Hoffentlich ist das eine hirnlos einfache Frage, aber es zeigt meine mangelnde Expertise mit C ++. Ich bin ein C # -Programmierer und habe mit P / Invoke in der Vergangenheit umfangreiche Arbeit mit C ++ / C-DLLs anderer Leute geleistet. Dieses Mal habe ich mich jedoch entschieden, selbst eine Wrapper-C ++ - DLL (unmanaged) zu schreiben und meine Wrapper-DLL dann von C # aus aufzurufen.
Das Problem, auf das ich sofort stoße, ist, dass ich keine C ++ - Funktion definieren kann, die von p / invoke gefunden werden kann. Ich weiß nicht, was die Syntax dafür ist, aber hier ist was ich bisher versuche:
%Vor%Ursprünglich hatte ich das einfach, aber es hat auch nicht funktioniert:
%Vor%Und dann auf der C # -Seite habe ich:
%Vor%Alles wird kompiliert, aber wenn ich diesen C # p / invoke-Aufruf ausführe, erhalte ich eine System.EntryPointNotFoundException: In der DLL 'Plugins \ TestDLL.dll' konnte kein Einstiegspunkt namens 'TestFunc' gefunden werden.
Sicherlich muss dies etwas unglaublich Einfaches am C ++ Ende sein, für das ich die Syntax einfach nicht kenne.
Sie möchten extern "C"
sowie __declspec(export)
verwenden, also:
Ausführliche Informationen finden Sie unter MSDN für Marshalling-Typen .
Erweitere Reeds richtige Antwort.
Ein weiteres Problem, mit dem Sie beim Aussetzen einer C ++ - Funktion über PInvoke umgehen können, ist die Verwendung ungültiger Typen. PInvoke kann wirklich nur das Marshalling von primitiven Typen und einfachen alten Datenstruktur- / Klassentypen unterstützen.
Angenommen, TestFunc hatte die folgende Signatur:
%Vor% Sogar das Hinzufügen von extern "C" und __declspec(dllexport)
würde nicht ausreichen, um die C ++ - Funktion zu offenbaren. Stattdessen müssten Sie eine Hilfsfunktion erstellen, die nur PInvoke-kompatible Typen verfügbar macht und dann in die Hauptfunktion aufgerufen wird. Zum Beispiel
Der C ++ - Compiler ändert die Namen Ihrer Funktionen, um Informationen über die Parameter und Rückgabetypen einzubeziehen. Dies wird Name Mangling genannt. Auf der anderen Seite, der C-Compiler nicht Ihre Funktionsnamen.
Sie können dem C ++ - Compiler mitteilen, dass er als C-Compiler arbeitet, indem er extern "C"
:
Um Funktionen von C # mit P / Invoke aufzurufen, dürfen Ihre Namen nicht verändert werden. Daher können Sie C-Funktionen tatsächlich in C # exportieren. Wenn Sie möchten, dass die Funktionalität in C ++ implementiert wird, können Sie eine C-Funktion schreiben, die nur die C ++ - Funktion aufruft, die die Funktionalität implementiert.
Macht etwas so:
%Vor%Und dann jede Funktion mit dem Schlüsselwort EXPORT deklarieren, zum Beispiel eine C ++ Funktion
%Vor%würde
werden %Vor%Dann der spaßige Teil: Geh zu deiner VS-Konsole und tippe:
%Vor%und Sie werden den zerrütteten Namen und Ordnungszahl aller Ihrer leicht exportierten Funktionen sehen, dann ist es nur eine Frage, sie zu beschweren
Erstellen Sie alle Projekte mit der Win32-Plattform und der entsprechenden Bit-Build-Option (z. B. x86 oder x64).