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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top