Pergunta

  1. Qual é a diferença de criar uma DLL simples entre o uso do Visual Studio 2005 e o Visual C ++. Vi que, ao criá-lo no Studio, também foi criado um manifesto e tive alguns problemas em relação à implantação em outra máquina por causa do uso da pasta lado a lado (ao chamar essa dll, formar um aplicativo C# "
  2. Como o mecanismo de chamar uma DLL funciona?

Obrigado

Foi útil?

Solução

Como Nobugz já cobriu sua primeira pergunta, deixe -me expandir o segundo. Não é terrivelmente difícil de entender.

Quando você compila uma DLL no Windows, o vinculador cria uma tabela de endereços de exportação (EAT) que lista todas as funções exportadas (as funções que a DLL fornece) e um ponteiro para onde são implementadas na própria DLL.

Ao compilar um aplicativo que vincula a uma DLL, o vinculador cria uma tabela de endereços de importação (IAT) listando todas as funções implementadas em outras DLLs e o nome da DLL que implementa essas funções. A maneira como ele sabe que existe uma função em uma DLL é do arquivo .lib que você adiciona ao seu projeto. Isso diz ao vinculador que uma função é implementada em uma DLL.

Em seguida, no tempo de execução, enquanto carrega um aplicativo, o carregador do Windows examina o IAT para ver o que as DLLs precisam ser carregadas, localizam -as e atualizam o aplicativo IAT (na memória) para apontar para as funções exportadas na DLL carregada.

Esse é o básico como funciona, espero que eu não tenha incluído nenhuma imprecisão bruta. E, é claro, P/Invoke é outra camada em cima disso.

Se você quiser mais informações sobre como o trabalho da DLL é sempre o Documentação do MSDN E se você quiser detalhes suficientes para fazer você girar a cabeça, leia esses artigos no Windows Parte 1 e Parte 2

Outras dicas

Sim, se você compilar o código da DLL com /md (a configuração padrão), então você precisa implantar as bibliotecas do CRT para a máquina de destino. Se essa for apenas uma DLL independente sem outras dependências, faz sentido compilar com a opção estática do CRT para que você não precise implantar as bibliotecas. Clique com o botão direito do mouse no seu projeto DLL, Propriedades, C /C ++, geração de código, biblioteca de tempo de execução = /mtd para a configuração de depuração. Repita para a configuração de liberação, agora usando /mt.

Google "P/Invoke Marshaling" para saber mais sobre como o código não gerenciado é chamado de um programa gerenciado.

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