Kann nicht DLL-Import-Eintrag, C # aufrufen -> C ++, EntryPointNotFoundException
-
20-09-2019 - |
Frage
Ich versuche, von C # eine Funktion in einer benutzerdefinierten DLL in C geschrieben anrufen ++. Ich bin die Warnung während der Code-Analyse jedoch immer und den Fehler zur Laufzeit:
Achtung: CA1400: Microsoft.Interoperability: Richtig die Erklärung von 'SafeNativeMethods.SetHook ()', so dass es weist zu Recht auf ein vorhandenes Eintrittspunkt in 'wi.dll'. der unmanaged Einstiegspunkt Name derzeit verknüpft SetHook ist.
Fehler: System.EntryPointNotFoundException war Nicht behandelte. Nicht imstande, einen Eintrag zu finden Punkt namens 'SetHook' in DLL 'wi.dll'.
Beide Projekte wi.dll und C # exe hat auf den gleichen DEBUG Ordner erstellt worden sind, befinden sich beide Dateien hier. Es gibt nur eine Datei mit dem Namen wi.dll in dem gesamten Dateisystem.
C ++ Funktionsdefinition sieht aus wie:
#define WI_API __declspec(dllexport)
bool WI_API SetHook();
kann ich exportierte Funktion mit Dependency Walker finden Sie unter:
as decorated: bool SetHook(void)
as undecorated: ?SetHook@@YA_NXZ
C # DLL-Import sieht aus wie (ich habe diese Zeilen definiert mit CLRInsideOut von MSDN Magazin):
[DllImport("wi.dll", EntryPoint = "SetHook", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Ich habe versucht, ohne Entrypoint und Calling Definitionen als auch.
Beide Projekte werden 32-Bit, ich bin mit W7 64 Bits, VS 2010 RC.
Ich glaube, dass ich einfach etwas übersehen haben ....
Vielen Dank im Voraus.
Lösung
Nun, wissen Sie den Eintrag Punktnamen, verwenden Sie die Entrypoint = „SetHook @@ YA_NXZ“ Eigenschaft in der [DllImport] Attribut. Oder setzte extern "C" vor der Deklaration in C ++ Code, so der Name nicht verstümmelt bekommt.
[DllImport("wi.dll", EntryPoint = "?SetHook@@YA_NXZ", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Andere Tipps
CallingConvention.Cdecl
bedeutet C nicht C ++, so dass, wenn Sie eine Funktion mit einem C ++ ergänzten Namen haben, müssen Sie die ergänzten Namen als EntryPoint
verwenden oder Extern „C“ in der C ++ Code Deklaration verwenden zu deaktivieren C ++ Namen Dekoration.