Wie richte ich eine C ++ - Funktion ein, damit sie von p / invoke verwendet werden kann?

8

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.

    
x4000 07.10.2009, 20:15
quelle

6 Antworten

12

Sie möchten extern "C" sowie __declspec(export) verwenden, also:

%Vor%

Ausführliche Informationen finden Sie unter MSDN für Marshalling-Typen .

    
Reed Copsey 07.10.2009, 20:21
quelle
6

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

%Vor%     
JaredPar 07.10.2009 20:35
quelle
1

Sie müssen diese Funktion mit extern "C" verfügbar machen, sonst wird der Name verändert.

    
Yakeen 07.10.2009 20:21
quelle
1

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" :

verwendet %Vor%

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.

    
pyon 07.10.2009 20:24
quelle
1

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

    
Sorcerer86pt 26.01.2011 14:51
quelle
0

Erstellen Sie alle Projekte mit der Win32-Plattform und der entsprechenden Bit-Build-Option (z. B. x86 oder x64).

    
Navin Pandit 24.02.2016 09:30
quelle

Tags und Links