Exportieren von Funktionen aus C++ dll in C# P/Invoke
Ich gebaut habe eine C++ dll, die ich nennen möchte aus C# - code. Ich bin in der Lage, rufen Sie eine Funktion auf, aber der andere wirft eine Ausnahme, wenn der C# - code versucht, um die dll zu laden.
Den header sieht wie folgt aus:
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Dies erzeugt eine dll mit ein bisschen verwirrend Exporte Tabelle (was bedeutet foo = foo bedeuten, in das Feld name ein?):
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
Mein P/Invoke-Deklarationen wie folgt Aussehen:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Den Anruf zu Installieren gibt keine Ausnahme, aber wenn ich Anrufe, PPPConnect, bekomme ich eine MissingMethodException - "nicht finden Können, ein Einstieg PPPConnect' in ein PInvoke-DLL "PPPManager.dll'."
Ich habe versucht, das entfernen der extern-und declspec Richtlinien aus dem Install-Funktion-Deklaration, so dass PPPConnect ist die einzige Funktion exportiert, und diese immer noch nicht lassen Sie mich rufen Sie PPPConnect.
Habe ich auch versucht dabei die DllImport durch Ordnungszahlen; das gibt das gleiche Ergebnis wie der Aufruf von name - Installation gibt, aber PPPConnect wirft die exception "Kann nicht gefunden" Entry Point '#2'...".
Interop-Protokoll gibt:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Dies ist auch außerhalb mein Fachgebiet, also, irgendwelche Vorschläge oder Anregungen wäre willkommen.
Dank,
Paul
Bearbeiten:
Es stellt sich heraus, dass dieser code funktioniert; das problem wurde mit der neuesten dll nicht weitergegeben wird an das Gerät. D ' Oh!
- Ich habe noch nie gehört von dieser interop-log - wie macht man das aktivieren/anzeigen, die?
- blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx ich begann, es zu benutzen, um zu versuchen und zu Debuggen dieses problem, aber es scheint, es würde gespeichert haben mir viel Zeit zum Debuggen MissingMethodExceptions.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie mit einem .def-Datei im dll-Projekt zu exportieren, die diese Funktionen? Wenn ja, entfernen Sie es und versuchen Sie es erneut. Dies ist nur eine Vermutung, weil es aussieht wie Sie Ihre Exporte nicht sind, was Sie sein sollten, wenn Sie ein extern "C" declspec(dllexports).
Habe ich versucht dieses mit einer einfachen C++ - dll mit
und eine einfache C# - app mit Ihrem PInvoke Erklärungen und es funktionierte gut.
Wenn ich ein dumpbin/exports auf die dll, die ich sah:
Dump-Datei PPPManager.dll
Dateityp: DLL
Abschnitt enthält die folgenden Exporte für PPPManager.dll
Beachten Sie, dass die exportierten Namen sind anders in meinem Fall.
Könnte es etwas so einfaches wie
PPPConnect
Versagen in einer Weise, die wird falsch, indem das OS. Versuchen Sie, die Durchführung beiderInstall
undPPPConnect
als no-ops (gerade haben Sie wiederTRUE
ohne etwas anderes zu tun) und sehen, ob der Fehler weiterhin besteht. Wenn dem so ist, tauschen die Reihenfolge, in der Sie exportiert werden (immer noch als no-ops) und sehen, ob das problem ist an die Bestellung (sehr unwahrscheinlich) oder etwas anderes.Können Sie auch mit dem grafischen tool
depends
zu bestätigen, was der DLL Export-Tabelle aussieht, aber ich bezweifle, dass das problem ist, die aus diesen Vierteln.Laut deiner Beschreibung Installieren und PPPConnect unterscheidet sich nur im Namen. Ich denke, Sie verwenden einfach die alten .dll-version mit der C# - Anwendung. Eine ohne PPPConnect definiert.
Den Erklärungen sieht richtig aus (soweit ich das beurteilen kann, ohne Quellen).
Große Informationen, aber wie Sie erwähnen, ist alles in Ordnung hier. Installieren Sie die Debugging-Tools für Windows und läuft:
um ein besseres abbild der Symbole-Tabelle; es ist ein blind geschossen, wie gut, aber Sie könnten auch versuchen:
im Fall der __declspec etwas seltsam.
dependency walker und öffnen Sie die DLL, um zu überprüfen, welche Methoden sind verfügbar,