Não é possível chamar a entrada de importação da dll, c# -> c ++, entrada de ponto de utensílio
-
20-09-2019 - |
Pergunta
Estou tentando ligar para C# uma função em uma DLL personalizada escrita em C ++. No entanto, estou recebendo o aviso durante a análise do código e o erro em tempo de execução:
AVISO: CA1400: Microsoft.Interperabilidade: Corrija a declaração de 'Safenativemethods.SetHook ()', de modo que aponte corretamente para um ponto de entrada existente em 'wi.dll'. O nome de ponto de entrada não gerenciado atualmente vinculado é Sethook.
Erro: System.EntryPointNotFoundException não foi tratado. Incapaz de encontrar um ponto de entrada chamado 'sethook' em dll 'wi.dll'.
Ambos os projetos WI.DLL e C# EXE foram compilados na mesma pasta de depuração, ambos os arquivos residem aqui. Existe apenas um arquivo com o nome Wi.dll em todo o sistema de arquivos.
A definição da função C ++ se parece:
#define WI_API __declspec(dllexport)
bool WI_API SetHook();
Eu posso ver a função exportada usando dependência Walker:
as decorated: bool SetHook(void)
as undecorated: ?SetHook@@YA_NXZ
C# DLL Importar parece (eu defini essas linhas usando o Clrinsideout da revista MSDN):
[DllImport("wi.dll", EntryPoint = "SetHook", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Eu tentei sem a entrada e as definições de concessão de chamadas também.
Ambos os projetos são de 32 bits, estou usando o W7 64 bits, vs 2010 RC.
Eu acredito que simplesmente esqueci algo ....
Desde já, obrigado.
Solução
Bem, você conhece o nome do ponto de entrada, use a propriedade EntryPoint = "? Sethook @@ ya_nxz" no atributo [dllimport]. Ou coloque externo "C" antes da declaração no seu código C ++ para que o nome não fique mutilado.
[DllImport("wi.dll", EntryPoint = "?SetHook@@YA_NXZ", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAsAttribute(UnmanagedType.I1)]
internal static extern bool SetHook();
Outras dicas
CallingConvention.Cdecl
significa C não C ++, então, quando você tem uma função com um nome decorado em C ++, você precisa usar o nome decorado como seu EntryPoint
ou use externo "C" na declaração de código C ++ para desativar a decoração de nome do C ++.