Impossibile chiamare la voce di importazione DLL, C # -> C ++, EntryPointNotFoundException
-
20-09-2019 - |
Domanda
Sto cercando di chiamare da C # una funzione in una DLL personalizzata scritta in C ++. Comunque sto ottenendo l'avvertimento durante l'analisi del codice e l'errore in fase di esecuzione:
Attenzione: CA1400: Microsoft.Interoperability: Corretta la dichiarazione di 'SafeNativeMethods.SetHook ()' in modo che si sottolinea giustamente ad una esistente punto di ingresso nella 'wi.dll'. il non gestito voce di nome del punto attualmente legato alla è SetHook.
Errore: System.EntryPointNotFoundException era non gestita. Impossibile trovare una voce punto chiamato 'SetHook' nella DLL 'wi.dll'.
Entrambi i progetti wi.dll e C # exe è stata redatta in nella stessa cartella DEBUG, entrambi i file risiedono qui. C'è solo un file con il nome wi.dll in tutto il file system.
C ++ definizione di funzione appare come:
#define WI_API __declspec(dllexport)
bool WI_API SetHook();
Posso vedere funzione esportata con Dependency Walker:
as decorated: bool SetHook(void)
as undecorated: ?SetHook@@YA_NXZ
C # DLL importazione sembra (ho definito queste righe utilizzando CLRInsideOut dalla rivista MSDN):
[DllImport("wi.dll", EntryPoint = "SetHook", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Ho provato senza definizioni EntryPoint e CallingConvention pure.
Entrambi i progetti sono a 32 bit, sto usando W7 64 bit, VS 2010 RC.
Credo che ho semplicemente ho trascurato qualcosa ....
Grazie in anticipo.
Soluzione
Bene, si conosce il nome punto di ingresso, utilizzare l'EntryPoint = "? SetHook @@ YA_NXZ" proprietà nell'attributo [DllImport]. O mettere extern "C" prima della dichiarazione nel codice C ++ in modo che il nome non ottiene straziati.
[DllImport("wi.dll", EntryPoint = "?SetHook@@YA_NXZ", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Altri suggerimenti
CallingConvention.Cdecl
significa C non C ++, in modo che quando si dispone di una funzione con un nome di C ++ decorato, è necessario utilizzare il nome decorato come EntryPoint
o utilizzare extern "C" nella dichiarazione di codice C ++ per spegnere C ++ decorazione dei nomi.