Ich verweise in meinem C # -Code immer auf DLLs, aber sie sind ein Rätsel geblieben, das ich gerne klären möchte. Dies ist eine Art Brain Dump von Fragen zu DLLs.
Ich verstehe, dass eine DLL eine dynamisch verknüpfte Bibliothek ist, was bedeutet, dass ein anderes Programm zur Laufzeit auf diese Bibliothek zugreifen kann, um "Funktionalität" zu erhalten. Betrachten Sie jedoch das folgende ASP.NET-Projekt mit Web.dll
und Business.dll
( Web.dll
ist die Front-End-Funktionalität und verweist Business.dll
auf Typen und Methoden).
Ab wann wird
Web.dll
dynamisch eine Verknüpfung hergestelltBusiness.dll
? Sie bemerken viel in Windows HDD Thrashing für scheinbar kleine Aufgaben, wenn Sie Word (usw.) verwenden, und ich gehe davon aus, dass Word nicht mehr funktioniert und Funktionen anderer DLLs dynamisch verknüpft?1a. Was lädt und verknüpft außerdem die DLL - das Betriebssystem oder ein Laufzeitframework wie das .NET-Framework?
1b. Was ist der Prozess der "Verknüpfung"? Werden Kompatibilitätsprüfungen durchgeführt? In den gleichen Speicher laden? Was bedeutet eigentlich Verknüpfen?
Was führt den Code in der DLL tatsächlich aus? Wird es vom Prozessor ausgeführt oder gibt es eine andere Phase der Übersetzung oder Kompilierung, bevor der Prozessor den Code in der DLL versteht?
2a. Was wird bei einer in C # .NET integrierten DLL ausgeführt: das .NET Framework oder das Betriebssystem direkt?
Funktioniert eine DLL von Linux auf einem Windows-System (falls vorhanden) oder sind sie betriebssystemspezifisch?
Sind DLLs spezifisch für ein bestimmtes Framework? Kann eine mit C # .NET erstellte DLL von einer mit Borland C ++ erstellten DLL verwendet werden?
4a. Wenn die Antwort auf 4 "Nein" lautet, wozu dient dann eine DLL? Warum verwenden die verschiedenen Frameworks keine eigenen Formate für verknüpfte Dateien? Beispiel: Eine in .NET integrierte EXE-Datei weiß, dass ein Dateityp von .abc mit ihrem Code verknüpft werden kann.
Gehen wir zurück zum
Web.dll
/Business.dll
Beispiel - eine Klasse Art von Kunden erreiche ich Referenz müssenBusiness.dll
ausWeb.dll
. Dies muss bedeuten, dassBusiness.dll
eine Art Spezifikation enthält, was eine Kundenklasse tatsächlich ist. Wenn ich meineBusiness.dll
Datei beispielsweise in Delphi kompiliert hätte: Würde C # sie verstehen und in der Lage sein, eine Kundenklasse zu erstellen, oder gibt es eine Art Header-Information oder etwas, das besagt: "Hey, tut mir leid, Sie können mich nur von einer anderen Delphi-DLL aus verwenden." ?5a. Gleiches gilt für Methoden; Kann ich eine
CreateInvoice()
Methode in eine DLL schreiben , sie in C ++ kompilieren und dann von C # aus darauf zugreifen und sie ausführen? Was hält mich davon ab oder erlaubt es mir?Beim Thema DLL-Hijacking muss die (schlechte) Ersatz-DLL sicherlich die genauen Methodensignaturen und -typen enthalten, die entführt werden. Ich nehme an, das wäre nicht schwer, wenn Sie herausfinden könnten, welche Methoden in der ursprünglichen DLL verfügbar sind.
6a. Was in meinem C # -Programm entscheidet, ob ich auf eine andere DLL zugreifen kann? Wenn meine entführte DLL genau die gleichen Methoden und Typen wie das Original enthalten würde, aber in einer anderen Sprache kompiliert würde, würde es funktionieren?
Was ist DLL-Import und DLL-Registrierung?