Não é possível chamar a entrada de importação da dll, c# -> c ++, entrada de ponto de utensílio

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

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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top