Eu tenho uma dll C # gerenciada que usa uma dll C ++ não gerenciada usando DLLImport. Tudo está funcionando muito bem. No entanto, desejo incorporar essa DLL não gerenciada em minha DLL gerenciada, conforme explicado pela Microsoft lá:
Portanto, adicionei o arquivo dll não gerenciado ao meu projeto de dll gerenciado, defina a propriedade como 'Recurso incorporado' e modifique o DLLImport para algo como:
[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
onde 'Wrapper Engine' é o nome do assembly de minha DLL gerenciada, 'Unmanaged Driver.dll' é a DLL não gerenciada
Quando corro, recebo:
Acesso negado. (Exceção de HRESULT: 0x80070005 (E_ACCESSDENIED))
Vi no MSDN e em http://blogs.msdn.com/suzcook/ que isso deveria ser possível ...
Respostas:
Você pode incorporar a DLL não gerenciada como um recurso se você mesmo extraí-la em um diretório temporário durante a inicialização e carregá-la explicitamente com LoadLibrary antes de usar P / Invoke. Usei essa técnica e funciona bem. Você pode preferir apenas vinculá-lo à montagem como um arquivo separado, como Michael observou, mas ter tudo em um arquivo tem suas vantagens. Esta é a abordagem que usei:
fonte
Aqui está minha solução, que é uma versão modificada da resposta de JayMcClellan. Salve o arquivo abaixo em um arquivo class.cs.
fonte
Eu não sabia que isso é possível - acho que o CLR precisa extrair a DLL nativa incorporada em algum lugar (o Windows precisa ter um arquivo para a DLL carregá-la - não pode carregar uma imagem da memória bruta) e onde quer que está tentando fazer que o processo não tenha permissão.
Algo como o Process Monitor da SysInternals pode lhe dar uma pista se o problema for que a criação do arquivo DLL está falhando ...
Atualizar:
Ah ... agora que li o artigo de Suzanne Cook (a página não apareceu para mim antes), observe que ela não está falando sobre incorporar a DLL nativa como um recurso dentro da DLL gerenciada, mas sim como um recurso vinculado - a DLL nativa ainda precisa ser seu próprio arquivo no sistema de arquivos.
Consulte http://msdn.microsoft.com/en-us/library/xawyf94k.aspx , onde diz:
O que isso parece fazer é adicionar metadados ao assembly que faz com que a DLL nativa faça parte logicamente do assembly (mesmo que seja um arquivo fisicamente separado). Portanto, coisas como colocar o assembly gerenciado no GAC incluirão automaticamente a DLL nativa, etc.
fonte
Você pode experimentar Costura.Fody . A documentação diz que ele é capaz de lidar com arquivos não gerenciados. Usei-o apenas para arquivos gerenciados e funciona perfeitamente :)
fonte
Também é possível simplesmente copiar as DLLs para qualquer pasta e, em seguida, chamar SetDllDirectory para essa pasta. Nenhuma chamada para LoadLibrary é necessária então.
fonte