J'ai récemment travaillé sur un projet qui utilisait la DLL de vc, mais il devait être appelé en .net. J'ai étudié comment appeler une DLL non gérée en C#.
Commençons par présenter le fichier dll
1.Fichier Dll
La bibliothèque de liens dynamiques (également appelée DLL, abréviation de « Dynamic Link Library ») est l'un des composants les plus importants de Microsoft Windows. Ouvrez le dossier système Windows et vous constaterez qu'il existe de nombreux fichiers DLL dans le dossier Windows. les principales fonctions du système sont implémentées sous la forme de modules DLL.
La bibliothèque de liens dynamiques ne peut pas être exécutée directement et ne peut pas non plus recevoir de messages. Il s'agit simplement d'un fichier indépendant contenant des fonctions (méthodes) qui peuvent être appelées par des programmes ou d'autres DLL pour effectuer certaines opérations. Remarque : généralement appelées « méthodes » en C#. ), mais ces fonctions ne font pas partie du programme d'exécution lui-même, mais sont chargées à la demande en fonction des besoins du processus, et ne peuvent jouer un rôle qu'à ce moment-là.
La DLL est chargée dans l'espace virtuel du processus par le système uniquement lorsque l'application en a besoin et devient partie intégrante du processus appelant. À ce stade, la DLL n'est accessible que par le thread du processus et son handle peut. être utilisé par le processus appelant, et le processus appelant Le handle de processus peut également être utilisé par la DLL. Dans la mémoire, une DLL n'a qu'une seule instance et sa préparation n'a rien à voir avec le langage de programmation et le compilateur spécifiques, donc une programmation en langage mixte peut être réalisée via une DLL. Tous les objets (y compris les variables) créés par le code dans une fonction DLL appartiennent au thread ou au processus qui l'appelle.
2. Appel de la DLL
Chaque langage de programmation a différentes méthodes d'appel de DLL. Ici, nous présentons uniquement la méthode d'appel de DLL en utilisant C#. Tout d’abord, vous devez comprendre ce qui est géré et ce qui ne l’est pas. De manière générale, on peut penser que le code non managé est principalement constitué de composants DLL et activeX développés sur la base de la plateforme Win 32, tandis que le code managé est développé sur la base de la plateforme .net.
(1) Méthode générale d'appel de fonctions non gérées dans une DLL
Tout d’abord, la méthode externe doit être déclarée dans le programme source du langage C#. Sa forme de base est :
[DLLImport("Fichier DLL")]
Le modificateur externe renvoie le nom de la méthode de type variable (liste de paramètres)
dans:
Fichier DLL : contient un fichier bibliothèque qui définit les méthodes externes.
Modificateurs : modificateurs d'accès, modificateurs autres qu'abstraits pouvant être utilisés lors de la déclaration de méthodes.
Type de variable de retour : type de variable de retour de la méthode que vous devez appeler dans le fichier DLL.
Nom de la méthode : le nom de la méthode que vous devez appeler dans le fichier DLL.
Liste des paramètres : la liste des méthodes que vous devez appeler dans le fichier DLL.
Remarque : L'espace de noms System.Runtime.InteropServices doit être utilisé dans la déclaration du programme.
DllImport ne peut être placé que sur les déclarations de méthode.
Le fichier DLL doit se trouver dans le répertoire courant du programme ou dans le chemin de requête défini par le système (c'est-à-dire : le chemin défini par Path dans la variable d'environnement système).
Le type de variable de retour, le nom de la méthode et la liste des paramètres doivent être cohérents avec les définitions du fichier DLL.
Si vous souhaitez utiliser d'autres noms de fonction, vous pouvez utiliser le paramètre de propriété EntryPoint, tel que :
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
Autres attributs DllImportAttribute facultatifs :
CharSet indique le jeu de caractères utilisé dans le point d'entrée, tel que : CharSet=CharSet.Ansi ;
SetLastError indique si la méthode conserve la « dernière erreur » Win32, par exemple : SetLastError=true ;
ExactSpelling indique si le EntryPoint doit correspondre exactement à l'orthographe du point d'entrée indiqué, par exemple : ExactSpelling=false ;
PreserveSig indique si la signature de la méthode doit être conservée ou convertie, par exemple : PreserveSig=true;
CallingConvention indique la convention d'appel du point d'entrée, telle que : CallingConvention=CallingConvention.Winapi ;