Impossibile chiamare la voce di importazione DLL, C # -> C ++, EntryPointNotFoundException

StackOverflow https://stackoverflow.com/questions/2465243

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top