Recentemente trabalhei em um projeto que usava a dll de vc, mas ela precisava ser chamada em .net. Estudei como chamar dll não gerenciada em c#.
Vamos primeiro apresentar o arquivo dll
1.Arquivo DLL
A biblioteca de link dinâmico (também chamada de DLL, abreviação de "Dynamic Link Library") é um dos componentes mais importantes do Microsoft Windows. Abra a pasta do sistema Windows e você descobrirá que há muitos arquivos DLL na pasta Alguns Windows. as principais funções do sistema são implementadas na forma de módulos DLL.
A biblioteca de vínculo dinâmico não pode ser executada diretamente, nem pode receber mensagens. É apenas um arquivo independente que contém funções (métodos) que podem ser chamados por programas ou outras DLLs para completar determinadas operações. Nota: Geralmente chamados de "métodos" em C#. ), mas essas funções não fazem parte do programa de execução em si, mas são carregadas sob demanda de acordo com as necessidades do processo, e só podem desempenhar uma função neste momento.
A DLL é carregada no espaço virtual do processo pelo sistema somente quando o aplicativo precisa e passa a fazer parte do processo de chamada. Nesse momento, a DLL só pode ser acessada pelo thread do processo, e seu identificador pode. ser usado pelo processo de chamada, e o processo de chamada O identificador do processo também pode ser usado pela DLL. Na memória, uma DLL possui apenas uma instância, e sua preparação não tem nada a ver com a linguagem de programação e o compilador específicos, portanto, a programação em linguagem mista pode ser obtida por meio de DLL. Quaisquer objetos (incluindo variáveis) criados por código dentro de uma função DLL pertencem ao thread ou processo que o chama.
2. Chamando DLL
Cada linguagem de programação possui métodos diferentes de chamada de DLL. Aqui apresentamos apenas o método de chamada de DLL usando C#. Primeiro, você precisa entender o que é gerenciado e o que não é gerenciado. De modo geral, pode-se pensar que o código não gerenciado é principalmente componentes DLL e activeX desenvolvidos com base na plataforma win 32, enquanto o código gerenciado é desenvolvido com base na plataforma .net.
(1) Método geral de chamada de funções não gerenciadas em DLL
Primeiro, o método externo deve ser declarado no programa fonte da linguagem C#. Sua forma básica é:
[DLLImport("Arquivo DLL")]
O modificador extern retorna o nome do método do tipo de variável (lista de parâmetros)
em:
Arquivo DLL: contém um arquivo de biblioteca que define métodos externos.
Modificadores: Modificadores de acesso, modificadores diferentes de abstratos que podem ser usados ao declarar métodos.
Tipo de variável de retorno: o tipo de variável de retorno do método que você precisa chamar no arquivo DLL.
Nome do método: O nome do método que você precisa chamar no arquivo DLL.
Lista de parâmetros: a lista de métodos que você precisa chamar no arquivo DLL.
Nota: O namespace System.Runtime.InteropServices precisa ser usado na declaração do programa.
DllImport só pode ser colocado em declarações de métodos.
O arquivo DLL deve estar localizado no diretório atual do programa ou no caminho de consulta definido pelo sistema (ou seja: o caminho definido por Path na variável de ambiente do sistema).
O tipo de variável de retorno, o nome do método e a lista de parâmetros devem ser consistentes com as definições no arquivo DLL.
Se quiser usar outros nomes de função, você pode usar a configuração da propriedade EntryPoint, como:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, tipo int);
Outros atributos DllImportAttribute opcionais:
CharSet indica o conjunto de caracteres utilizado no ponto de entrada, como: CharSet=CharSet.Ansi;
SetLastError indica se o método retém o "último erro" do Win32, como: SetLastError=true;
ExactSpelling indica se o EntryPoint deve corresponder exatamente à ortografia do ponto de entrada indicado, como: ExactSpelling=false;
PreserveSig indica se a assinatura do método deve ser preservada ou convertida, como: PreserveSig=true;
CallingConvention indica a convenção de chamada do ponto de entrada, como: CallingConvention=CallingConvention.Winapi;