Recientemente trabajé en un proyecto que usaba dll de vc, pero era necesario llamarlo en .net. Estudié cómo llamar a dll no administrado en c#.
Primero introduzcamos el archivo dll.
1.archivo DLL
La biblioteca de enlaces dinámicos (también llamada DLL, abreviatura de "Biblioteca de enlaces dinámicos") es uno de los componentes más importantes de Microsoft Windows. Abra la carpeta del sistema de Windows y encontrará que hay muchos archivos DLL en la carpeta. Las funciones principales del sistema se implementan en forma de módulos DLL.
La biblioteca de enlaces dinámicos no se puede ejecutar directamente ni puede recibir mensajes. Es solo un archivo independiente que contiene funciones (métodos) que pueden ser llamados por programas u otras DLL para completar ciertas operaciones. Nota: Generalmente llamado "métodos" en C#. ), pero estas funciones no son parte del programa de ejecución en sí, sino que se cargan bajo demanda de acuerdo con las necesidades del proceso y solo pueden desempeñar un papel en este momento.
El sistema carga la DLL en el espacio virtual del proceso solo cuando la aplicación lo necesita y se convierte en parte del proceso de llamada. En este momento, solo el subproceso del proceso puede acceder a la DLL y su identificador puede hacerlo. ser utilizado por el proceso de llamada, y el proceso de llamada El identificador del proceso también puede ser utilizado por la DLL. En la memoria, una DLL tiene solo una instancia y su preparación no tiene nada que ver con el lenguaje de programación y el compilador específicos, por lo que la programación en lenguaje mixto se puede lograr a través de DLL. Cualquier objeto (incluidas las variables) creado por código dentro de una función DLL es propiedad del hilo o proceso que lo llama.
2. Llamar a DLL
Cada lenguaje de programación tiene diferentes métodos para llamar a DLL. Aquí solo presentamos el método para llamar a DLL usando C#. En primer lugar, es necesario comprender qué se gestiona y qué no se gestiona. En términos generales, se puede pensar que el código no administrado se basa principalmente en componentes DLL y activeX desarrollados en base a la plataforma win 32, mientras que el código administrado se desarrolla en base a la plataforma .net.
(1) Método general para llamar a funciones no administradas en DLL
Primero, el método externo debe declararse en el programa fuente del lenguaje C#. Su forma básica es:
[DLLImport("archivo DLL")]
El modificador externo devuelve el nombre del método de tipo variable (lista de parámetros)
en:
Archivo DLL: contiene un archivo de biblioteca que define métodos externos.
Modificadores: modificadores de acceso, modificadores distintos de los abstractos que se pueden utilizar al declarar métodos.
Tipo de variable de retorno: el tipo de variable de retorno del método que necesita llamar en el archivo DLL.
Nombre del método: el nombre del método que necesita llamar en el archivo DLL.
Lista de parámetros: la lista de métodos que necesita llamar en el archivo DLL.
Nota: El espacio de nombres System.Runtime.InteropServices debe usarse en la declaración del programa.
DllImport solo se puede colocar en declaraciones de métodos.
El archivo DLL debe estar ubicado en el directorio actual del programa o en la ruta de consulta definida por el sistema (es decir, la ruta establecida por Ruta en la variable de entorno del sistema).
El tipo de variable de retorno, el nombre del método y la lista de parámetros deben ser coherentes con las definiciones del archivo DLL.
Si desea utilizar otros nombres de funciones, puede utilizar la configuración de la propiedad EntryPoint, como por ejemplo:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
estático externo int MsgBox (int hWnd, mensaje de cadena, título de cadena, tipo int);
Otros atributos opcionales de DllImportAttribute:
CharSet indica el juego de caracteres utilizado en el punto de entrada, como por ejemplo: CharSet=CharSet.Ansi;
SetLastError indica si el método conserva el "último error" de Win32, como por ejemplo: SetLastError=true;
ExactSpelling indica si EntryPoint debe coincidir exactamente con la ortografía del punto de entrada indicado, como por ejemplo: ExactSpelling=false;
PreserveSig indica si la firma del método debe conservarse o convertirse, como por ejemplo: PreserveSig=true;
CallingConvention indica la convención de llamada del punto de entrada, como por ejemplo: CallingConvention=CallingConvention.Winapi;