Was genau sind DLL-Dateien und wie funktionieren sie?

224

Wie genau funktionieren DLL-Dateien? Es scheint sehr viele von ihnen zu geben, aber ich weiß nicht, was sie sind oder wie sie funktionieren.

Also, was ist mit ihnen los?

Stalepretzel
quelle
6
Da dies nur mit Windows markiert ist und diese Frage bereits 2008 geschrieben wurde, ist zu erwähnen, dass DLLs heutzutage auch auf Mac und Linux mit .NET Core ausgeführt werden.
Jim Aho

Antworten:

287

Was ist eine DLL?

Dynamic Link Libraries (DLLs) ähneln EXEs, sind jedoch nicht direkt ausführbar. Sie ähneln .so-Dateien unter Linux / Unix. Das heißt, DLLs sind die Implementierung gemeinsam genutzter Bibliotheken durch MS.

DLLs ähneln so sehr einer EXE-Datei, dass das Dateiformat selbst dasselbe ist. Sowohl EXE- als auch DLLs basieren auf dem PE-Dateiformat (Portable Executable). DLLs können auch COM-Komponenten und .NET-Bibliotheken enthalten.

Was enthält eine DLL?

Eine DLL enthält Funktionen, Klassen, Variablen, Benutzeroberflächen und Ressourcen (wie Symbole, Bilder, Dateien usw.), die eine EXE-Datei oder eine andere DLL verwendet.

Arten von Bibliotheken:

Auf praktisch allen Betriebssystemen gibt es zwei Arten von Bibliotheken. Statische Bibliotheken und dynamische Bibliotheken. In Windows lauten die Dateierweiterungen wie folgt: Statische Bibliotheken (.lib) und dynamische Bibliotheken (.dll). Der Hauptunterschied besteht darin, dass statische Bibliotheken zur Kompilierungszeit mit der ausführbaren Datei verknüpft werden. Während dynamisch verknüpfte Bibliotheken erst zur Laufzeit verknüpft werden.

Weitere Informationen zu statischen und dynamischen Bibliotheken:

Normalerweise werden auf Ihrem Computer keine statischen Bibliotheken angezeigt, da eine statische Bibliothek direkt in ein Modul (EXE oder DLL) eingebettet ist. Eine dynamische Bibliothek ist eine eigenständige Datei.

Eine DLL kann jederzeit geändert werden und wird nur zur Laufzeit geladen, wenn eine EXE-Datei die DLL explizit lädt. Eine statische Bibliothek kann nicht geändert werden, sobald sie in der EXE-Datei kompiliert wurde. Eine DLL kann einzeln aktualisiert werden, ohne die EXE selbst zu aktualisieren.

Laden einer DLL:

Ein Programm lädt eine DLL beim Start, über die Win32-API LoadLibrary oder wenn es sich um eine Abhängigkeit von einer anderen DLL handelt. Ein Programm verwendet die GetProcAddress zum Laden einer Funktion oder LoadResource zum Laden einer Ressource.

Weiterführende Literatur:

Bitte überprüfen Sie MSDN oder Wikipedia für weitere Informationen. Auch die Quellen dieser Antwort.

Brian R. Bondy
quelle
5
Sollte wohl irgendwo die Importbibliothek erwähnen. OK, ich gehe jetzt weg. :)
Adam Mitz
2
Entfernte diejenigen, die angesprochen zu werden scheinen. Wie bekomme ich dafür Punkte? <g>
Adam Mitz
36

Was ist eine DLL?

DLL-Dateien sind Binärdateien, die ausführbaren Code und Ressourcen wie Bilder usw. enthalten können. Im Gegensatz zu Anwendungen können diese nicht direkt ausgeführt werden, aber eine Anwendung lädt sie nach Bedarf (oder alle gleichzeitig beim Start).

Sind sie wichtig?

Die meisten Anwendungen laden die DLL-Dateien, die sie beim Start benötigen. Wenn eines dieser Elemente nicht gefunden wird, kann das System den Vorgang überhaupt nicht starten.

Für DLL-Dateien sind möglicherweise andere DLL-Dateien erforderlich

Ebenso wie eine Anwendung eine DLL-Datei benötigt, kann eine DLL-Datei von anderen DLL-Dateien selbst abhängig sein. Wenn eine dieser DLL-Dateien in der Abhängigkeitskette nicht gefunden wird, wird die Anwendung nicht geladen. Dies kann mit allen Dependency Walker-Tools wie Dependency Walker problemlos behoben werden .

Es gibt so viele davon in den Systemordnern

Der größte Teil der Systemfunktionalität wird einem Benutzerprogramm in Form von DLL-Dateien zur Verfügung gestellt, da dies eine Standardform für die gemeinsame Nutzung von Code / Ressourcen ist. Jede Funktionalität wird separat in verschiedenen DLL-Dateien gespeichert, sodass nur die erforderlichen DLL-Dateien geladen werden und somit die Speicherbeschränkungen auf dem System verringert werden.

Installierte Anwendungen verwenden auch DLL-Dateien

DLL-Dateien werden auch zu einer Form der physischen Trennung von Funktionen, wie oben erläutert. Gute Anwendungen versuchen auch, die DLL-Dateien erst zu laden, wenn sie unbedingt erforderlich sind, was den Speicherbedarf verringert. Auch dies führt dazu, dass Anwendungen mit vielen DLL-Dateien ausgeliefert werden.

DLL Hölle

Manchmal brechen System-Upgrades jedoch häufig andere Programme, wenn zwischen den freigegebenen DLL-Dateien und dem Programm, das sie benötigt, eine Versionsinkongruenz besteht. Systemprüfpunkte und DLL-Cache usw. waren die Initiativen von M $, um dieses Problem zu lösen. Die .NET-Plattform ist möglicherweise überhaupt nicht mit diesem Problem konfrontiert.

Woher wissen wir, was in einer DLL-Datei enthalten ist?

Sie müssen ein externes Tool wie DUMPBIN oder Dependency Walker verwenden, das nicht nur anzeigt , welche öffentlich sichtbaren Funktionen (sogenannte Exporte) in den DLL-Dateien enthalten sind und welche anderen DLL-Dateien erforderlich sind und welche diese DLL-Dateien aus diesen DLL-Dateien exportieren ist abhängig von.

Wie erstellen / verwenden wir sie?

Lesen Sie die Programmierdokumentation Ihres Herstellers. Informationen zu C ++ finden Sie unter LoadLibrary in MSDN.

Computerleben
quelle
2
Bitte vervollständigen Sie diesen Satz ( "The .NET platform might not face this issue at all.") mit einem Warum. Vielen Dank.
Jogi
1
@RehanKhan Ab .NET Framework v2.0 lädt die Laufzeit nur Assembles, die mit einer .NET-Version <= aktuell geladene Laufzeit kompiliert wurden. + .NET speichert auch fehlgeschlagene Versuche zum Laden von Assemblys zwischen, + wenn ein vorheriger Aufruf bereits eine Assembly gefunden hat, die CL-Laufzeit verwendet die bereits geladene Baugruppe. Alles in allem würde ich sagen, dass es besser ist zu sagen, dass sie das Problem gelöst haben, indem sie sehr starke Einschränkungen für das Laden der DLLs eines Programms angewendet haben (bevor es einfach aufgibt und um Ihre Hilfe bittet).
Vladislav Martin
14

Angenommen, Sie erstellen eine ausführbare Datei, die einige Funktionen einer Bibliothek verwendet.

Wenn die von Ihnen verwendete Bibliothek statisch ist , kopiert der Linker den Objektcode für diese Funktionen direkt aus der Bibliothek und fügt sie in die ausführbare Datei ein.

Wenn diese ausführbare Datei ausgeführt wird, verfügt sie über alles, was sie benötigt. Der ausführbare Loader lädt sie einfach in den Speicher und führt sie aus.

Wenn die Bibliothek dynamisch ist, fügt der Linker keinen Objektcode ein, sondern einen Stub, der im Grunde besagt, dass sich diese Funktion in dieser DLL an dieser Stelle befindet.

Wenn diese ausführbare Datei ausgeführt wird, fehlen Bits der ausführbaren Datei (dh die Stubs), sodass der Loader die ausführbare Datei durchläuft und die fehlenden Stubs repariert. Erst wenn alle Stubs aufgelöst wurden, kann die ausführbare Datei ausgeführt werden.

Um dies in Aktion zu sehen, löschen oder benennen Sie die DLL um und beobachten Sie, wie der Loader einen fehlenden DLL-Fehler meldet, wenn Sie versuchen, die ausführbare Datei auszuführen.

Daher der Name Dynamic Link Library , Teile des Verknüpfungsprozesses werden zur Laufzeit vom ausführbaren Loader dynamisch ausgeführt.

Ein letzter Hinweis: Wenn Sie keine Verknüpfung zur DLL herstellen, werden vom Linker keine Stubs eingefügt. Windows stellt jedoch weiterhin die GetProcAddress- API bereit , mit der Sie den Einstiegspunkt für die Ausführung der DLL-Funktion lange nach dem Start der ausführbaren Datei laden können.

jussij
quelle
12

DLLs (Dynamic Link Libraries) und SLs (Shared Libraries, äquivalent unter UNIX) sind nur Bibliotheken mit ausführbarem Code, die beim Laden dynamisch mit einer ausführbaren Datei verknüpft werden können.

Statische Bibliotheken werden zur Kompilierungszeit in eine ausführbare Datei eingefügt und ab diesem Zeitpunkt behoben. Sie vergrößern die ausführbare Datei und können nicht gemeinsam genutzt werden.

Dynamische Bibliotheken bieten folgende Vorteile:

1 / Sie werden zur Laufzeit und nicht zur Kompilierungszeit geladen, sodass sie unabhängig von der ausführbaren Datei aktualisiert werden können (alle ausgefallenen Fenster und Dialogfelder, die Sie in Windows sehen, stammen aus DLLs, sodass sich das Erscheinungsbild Ihrer Anwendung ohne Sie ändern kann neu schreiben müssen).

2 / Da sie unabhängig sind, kann der Code von mehreren ausführbaren Dateien gemeinsam genutzt werden. Dies spart Speicherplatz, da sich beim Ausführen von 100 Apps mit einer einzelnen DLL möglicherweise nur eine Kopie der DLL im Speicher befindet.

Ihr Hauptnachteil ist Vorteil Nr. 1: Wenn sich DLLs unabhängig von Ihrer Anwendung ändern, funktioniert Ihre Anwendung möglicherweise nicht mehr oder verhält sich bizarr. Die DLL-Versionierung wird unter Windows in der Regel nicht sehr gut verwaltet, was zu der kuriosen "DLL-Hölle" führt.

paxdiablo
quelle
11

DLL-Dateien enthalten eine Exporttabelle , eine Liste von Symbolen, die vom aufrufenden Programm nachgeschlagen werden können. Die Symbole sind normalerweise Funktionen mit der C-Aufrufkonvention ( __stcall ). Die Exporttabelle enthält auch die Adresse der Funktion.

Mit diesen Informationen kann das aufrufende Programm dann die Funktionen innerhalb der DLL aufrufen, obwohl es zum Zeitpunkt der Kompilierung keinen Zugriff auf die DLL hatte.

Die Einführung in Dynamic Link Libraries enthält weitere Informationen.

Adam Pierce
quelle
6

http://support.microsoft.com/kb/815065

Eine DLL ist eine Bibliothek, die Code und Daten enthält, die von mehreren Programmen gleichzeitig verwendet werden können. Unter Windows-Betriebssystemen führt die Comdlg32-DLL beispielsweise allgemeine Funktionen im Zusammenhang mit Dialogfeldern aus. Daher kann jedes Programm die in dieser DLL enthaltenen Funktionen verwenden, um ein Dialogfeld zum Öffnen zu implementieren. Dies fördert die Wiederverwendung von Code und eine effiziente Speichernutzung.

Durch die Verwendung einer DLL kann ein Programm in separate Komponenten modularisiert werden. Beispielsweise kann ein Buchhaltungsprogramm nach Modulen verkauft werden. Jedes Modul kann zur Laufzeit in das Hauptprogramm geladen werden, wenn dieses Modul installiert ist. Da die Module getrennt sind, ist die Ladezeit des Programms schneller und ein Modul wird nur geladen, wenn diese Funktionalität angefordert wird.

Darüber hinaus lassen sich Aktualisierungen einfacher auf jedes Modul anwenden, ohne andere Teile des Programms zu beeinflussen. Beispielsweise haben Sie möglicherweise ein Gehaltsabrechnungsprogramm, und die Steuersätze ändern sich jedes Jahr. Wenn diese Änderungen in einer DLL isoliert sind, können Sie ein Update anwenden, ohne das gesamte Programm erneut erstellen oder installieren zu müssen.

http://en.wikipedia.org/wiki/Dynamic-link_library

Jorge Ferreira
quelle
2

DLL ist eine Dateierweiterung und das als "Dynamic Link Library" bekannte Dateiformat, das zum Speichern mehrerer Codes und Prozeduren für Windows-Programme verwendet wird. Software & Games wird auf der Basis von DLL-Dateien ausgeführt. DLL-Dateien wurden erstellt, damit mehrere Anwendungen ihre Informationen gleichzeitig verwenden können.

Wenn Sie weitere Informationen zu DLL-Dateien erhalten möchten oder auf einen Fehler stoßen, lesen Sie den folgenden Beitrag. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

Akshya Nagar
quelle
1

DLLs (Dynamic Link Libraries) enthalten Ressourcen, die von einer oder mehreren Anwendungen oder Diensten verwendet werden. Sie können Klassen, Symbole, Zeichenfolgen, Objekte, Schnittstellen und so ziemlich alles enthalten, was ein Entwickler außer einer Benutzeroberfläche speichern müsste.

tsilb
quelle
3
Sie können tatsächlich eine Benutzeroberfläche speichern, und mehrere Programme tun dies. Zum Beispiel Snap-Ins.
Brian R. Bondy
1

Laut Microsoft

(DLL) Dynamische Linkbibliotheken sind Dateien, die Daten, Code oder Ressourcen enthalten, die zum Ausführen von Anwendungen benötigt werden. Hierbei handelt es sich um Dateien, die vom Windows-Ökosystem erstellt werden und von zwei oder mehr Anwendungen gemeinsam genutzt werden können.

Wenn ein Programm oder eine Software unter Windows ausgeführt wird, hängt ein Großteil der Funktionsweise der Anwendung von den DLL-Dateien des Programms ab. Wenn eine bestimmte Anwendung beispielsweise mehrere Module hatte, wird die Interaktion der einzelnen Module untereinander durch die Windows-DLL-Dateien bestimmt.

Wenn Sie eine ausführliche Erklärung wünschen, überprüfen Sie diese nützlichen Ressourcen

Was sind DLL - Dateien , über DLL - Dateien

Code-Builder
quelle