Ich habe kürzlich an einem Projekt gearbeitet, das die DLL von vc verwendete, aber es musste in .net aufgerufen werden. Ich habe gelernt, wie man eine nicht verwaltete DLL in C# aufruft.
Lassen Sie uns zunächst die DLL-Datei vorstellen
1.DLL-Datei
Die Dynamic Link Library (auch DLL genannt, kurz für „Dynamic Link Library“) ist eine der wichtigsten Komponenten von Microsoft Windows. Öffnen Sie den Windows-Systemordner und Sie werden feststellen, dass sich darin viele DLL-Dateien befinden Wichtige Systemfunktionen werden in Form von DLL-Modulen implementiert.
Die dynamische Linkbibliothek kann weder direkt ausgeführt werden noch kann sie Nachrichten empfangen. Sie ist lediglich eine unabhängige Datei, die Funktionen (Methoden) enthält, die von Programmen oder anderen DLLs aufgerufen werden können, um bestimmte Vorgänge abzuschließen. Hinweis: In C# allgemein als „Methoden“ bezeichnet. ), aber diese Funktionen sind nicht Teil des Ausführungsprogramms selbst, sondern werden bei Bedarf entsprechend den Anforderungen des Prozesses geladen und können zu diesem Zeitpunkt nur eine Rolle spielen.
Die DLL wird vom System nur dann in den virtuellen Raum des Prozesses geladen, wenn die Anwendung sie benötigt, und wird Teil des aufrufenden Prozesses. Zu diesem Zeitpunkt kann nur der Thread des Prozesses und sein Handle darauf zugreifen vom aufrufenden Prozess verwendet werden, und der aufrufende Prozess Das Prozesshandle kann auch von der DLL verwendet werden. Im Speicher hat eine DLL nur eine Instanz, und ihre Vorbereitung hat nichts mit der spezifischen Programmiersprache und dem Compiler zu tun, sodass eine gemischtsprachige Programmierung über die DLL erreicht werden kann. Alle Objekte (einschließlich Variablen), die durch Code innerhalb einer DLL-Funktion erstellt werden, gehören dem Thread oder Prozess, der sie aufruft.
2. DLL aufrufen
Jede Programmiersprache verfügt über unterschiedliche Methoden zum Aufrufen von DLL. Hier stellen wir nur die Methode zum Aufrufen von DLL mit C# vor. Zunächst müssen Sie verstehen, was verwaltet und was nicht verwaltet wird. Im Allgemeinen kann davon ausgegangen werden, dass es sich bei nicht verwaltetem Code hauptsächlich um DLL- und ActiveX-Komponenten handelt, die auf der Grundlage der Win 32-Plattform entwickelt werden, während verwalteter Code auf der Grundlage der .net-Plattform entwickelt wird.
(1) Allgemeine Methode zum Aufrufen nicht verwalteter Funktionen in der DLL
Zunächst sollte die externe Methode im C#-Sprachquellprogramm deklariert werden. Ihre Grundform ist:
[DLLImport("DLL-Datei")]
Der Modifikator extern gibt den Methodennamen des Variablentyps (Parameterliste) zurück.
In:
DLL-Datei: enthält eine Bibliotheksdatei, die externe Methoden definiert.
Modifikatoren: Zugriffsmodifikatoren, andere Modifikatoren als abstrakte Modifikatoren, die beim Deklarieren von Methoden verwendet werden können.
Rückgabevariablentyp: Der Rückgabevariablentyp der Methode, die Sie in der DLL-Datei aufrufen müssen.
Methodenname: Der Name der Methode, die Sie in der DLL-Datei aufrufen müssen.
Parameterliste: Die Liste der Methoden, die Sie in der DLL-Datei aufrufen müssen.
Hinweis: Der Namespace System.Runtime.InteropServices muss in der Programmdeklaration verwendet werden.
DllImport kann nur auf Methodendeklarationen platziert werden.
Die DLL-Datei muss sich im aktuellen Verzeichnis des Programms oder im vom System definierten Abfragepfad befinden (d. h. der durch Path in der Systemumgebungsvariablen festgelegte Pfad).
Der Typ der Rückgabevariable, der Methodenname und die Parameterliste müssen mit den Definitionen in der DLL-Datei übereinstimmen.
Wenn Sie andere Funktionsnamen verwenden möchten, können Sie die Einstellung der EntryPoint-Eigenschaft verwenden, z. B.:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
Weitere optionale DllImportAttribute-Attribute:
CharSet gibt den im Einstiegspunkt verwendeten Zeichensatz an, z. B.: CharSet=CharSet.Ansi;
SetLastError gibt an, ob die Methode den „letzten Fehler“ von Win32 beibehält, z. B.: SetLastError=true;
ExactSpelling gibt an, ob der EntryPoint genau mit der Schreibweise des angegebenen Einstiegspunkts übereinstimmen muss, z. B.: ExactSpelling=false;
PreserveSig gibt an, ob die Signatur der Methode beibehalten oder konvertiert werden soll, z. B.: PreserveSig=true;
CallingConvention gibt die Aufrufkonvention des Einstiegspunkts an, z. B.: CallingConvention=CallingConvention.Winapi;