Unterschied zwischen .dll und .exe?


91

Ich möchte den genauen Unterschied zwischen der DLL- und der Exe-Datei kennen.


1
Sie sollten hier einen Kontext hinzufügen: Sind Sie ein Anfänger? Suchen Sie eine tiefgreifende technische Spezifikation des PE-
Materials

3
Es ist wahr, ich bin ein Anfänger. Es ist eine Interviewfrage wie markiert.
Umesh Aawte

Noch wichtiger ist , ist dies ein Duplikat einschließlich eines (gestrichen) von sakthivignesh ...
Marc GRA

Antworten:


71

EXE:

  1. Es ist eine ausführbare Datei
  2. Beim Laden einer ausführbaren Datei wird kein Export aufgerufen, sondern nur der Moduleinstiegspunkt.
  3. Wenn ein System eine neue ausführbare Datei startet, wird ein neuer Prozess erstellt
  4. Der Eintragsthread wird im Kontext des Hauptthreads dieses Prozesses aufgerufen.

DLL:

  1. Es ist eine Dynamic Link Library
  2. Es gibt mehrere exportierte Symbole.
  3. Das System lädt eine DLL in den Kontext eines vorhandenen Prozesses.

Für weitere Details: http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_E__

Referenz: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx


9
Das System lädt eine DLL in einen vorhandenen PROCESS, nicht in einen Thread. Jede DLL in einem Prozess kann über eine LibMainFunktion eine Benachrichtigung erhalten, wenn ein Thread gestartet oder gestoppt wird .
Daniel Earwicker

13
Ihre Punkte 1 und 2 sind nicht 100% korrekt. Da Sie LoadLibraryEx für eine Exe oder DLL verwenden können, bedeutet dies, dass Sie mit GetProcAddress einen Einstiegspunkt aus einer Exe oder einer DLL laden können. In dieser Hinsicht können sowohl exe- als auch dll-Dateien dynamisch verknüpft werden und eine beliebige Anzahl von Einstiegspunkten aufweisen.
Jussij

130

Ich weiß nicht, warum jeder diese Frage im Kontext von .NET beantwortet. Die Frage war allgemein und erwähnte .NET nirgendwo.

Nun, die Hauptunterschiede sind:

EXE

  1. Eine Exe wird immer in ihrem eigenen Adressraum ausgeführt, dh es handelt sich um einen separaten Prozess.
  2. Der Zweck einer EXE ist es, eine eigene Anwendung zu starten.

DLL

  1. Eine DLL benötigt immer eine Host-Exe, um ausgeführt zu werden. Das heißt, es kann niemals in einem eigenen Adressraum ausgeführt werden.
  2. Der Zweck einer DLL besteht darin, eine Sammlung von Methoden / Klassen zu haben, die von einer anderen Anwendung aus wiederverwendet werden können.
  3. DLL ist die Implementierung einer gemeinsam genutzten Bibliothek durch Microsoft.

Das Dateiformat von DLL und exe ist im Wesentlichen dasselbe. Windows erkennt den Unterschied zwischen DLL und EXE über den PE-Header in der Datei. Einzelheiten zum PE-Header finden Sie in diesem Artikel zu MSDN


4
Also, wenn Sie möchten, können Sie den Header des Fikles umbenennen und bearbeiten, um eine DLL in eine Exe zu verwandeln und umgekehrt?
RCIX

@ RCIX: Ich bezweifle, dass das möglich ist?
VoodooChild

Es ist höchstwahrscheinlich nicht möglich - siehe Kichiks Antwort unten.
Jonathon Reinhart

30

Der Unterschied besteht darin, dass eine EXE-Datei einen Einstiegspunkt hat, eine "Haupt" -Methode, die bei der Ausführung ausgeführt wird.

Der Code in einer DLL muss von einer anderen Anwendung aufgerufen werden.


11
Dies ist eine Fehlladung. Dies bedeutet, dass DLLs keine Einstiegspunkte haben. DLLs können einen DLLMain-Einstiegspunkt haben, der aufgerufen wird, wenn (unter anderem) die DLL in den Prozess geladen wird
jay.lee

28

Es gibt noch einige Unterschiede in Bezug auf die Struktur, die Sie erwähnen könnten.

  1. Sowohl DLL als auch EXE haben dieselbe Dateistruktur - Portable Executable oder PE. Um zwischen den beiden zu unterscheiden, kann man in das CharacteristicsMitglied von IMAGE_FILE_HEADERinnen schauen IMAGE_NT_HEADERS. Für eine DLL ist das IMAGE_FILE_DLLFlag (0x2000) aktiviert. Für eine EXE ist es das IMAGE_FILE_EXECUTABLE_IMAGE(0x2) -Flag.
  2. PE-Dateien bestehen aus einigen Headern und mehreren Abschnitten. Normalerweise gibt es einen Abschnitt für Code, einen Abschnitt für Daten, einen Abschnitt mit importierten Funktionen und einen Abschnitt für Ressourcen. Einige Abschnitte können mehr als eine Sache enthalten. Der Header beschreibt auch eine Liste der Datenverzeichnisse, die sich in den Abschnitten befinden. Diese Datenverzeichnisse ermöglichen es Windows, im PE zu finden, was es benötigt. Eine Art von Datenverzeichnis, das eine EXE-Datei niemals haben wird (es sei denn, Sie erstellen eine Frankenstein-EXE-Datei), ist das Exportverzeichnis. Hier haben DLL-Dateien eine Liste der Funktionen, die sie exportieren und die von anderen EXE- oder DLL-Dateien verwendet werden können. Auf der anderen Seite verfügt jede DLL und EXE über ein Importverzeichnis, in dem die Funktionen und DLL-Dateien aufgelistet sind, die zum Ausführen erforderlich sind.
  3. Auch in den PE-Headern ( IMAGE_OPTIONAL_HEADER) befindet sich das ImageBaseMitglied. Es gibt die virtuelle Adresse an, unter der das PE davon ausgeht, dass es geladen wird. Wenn es an einer anderen Adresse geladen wird, können einige Zeiger auf den falschen Speicher verweisen. Da EXE-Dateien zu den ersten gehören, die in ihren neuen Adressraum geladen werden, kann der Windows-Loader eine konstante Ladeadresse sicherstellen, und das ist normalerweise 0x00400000. Dieser Luxus existiert für eine DLL nicht. Zwei in denselben Prozess geladene DLL-Dateien können dieselbe Adresse anfordern. Aus diesem Grund verfügt eine DLL über ein anderes Datenverzeichnis namens Base Relocation Directory, das sich normalerweise in einem eigenen Abschnitt befindet .reloc. Dieses Verzeichnis enthält eine Liste von Stellen in der DLL, die neu basiert / gepatcht werden müssen, damit sie auf den richtigen Speicher verweisen. Die meisten EXE-Dateien haben dieses Verzeichnis nicht, aber einige alte Compiler generieren sie.

Weitere Informationen zu diesem Thema finden Sie unter @ MSDN .


1
1. Da es sich um Flags handelt, können beide gleichzeitig gesetzt werden. 2. Wie Sie sagten, ist es möglich, aber verschwindend unwahrscheinlich. 3. ASLR wird auch die Exe verschieben, wenn dies möglich ist. Also ja, sogar eine Exe kann Umzüge haben. Alles in allem sind EXEs, die DLLs sind, möglich, aber selten .
Deduplikator

20

Diese Antwort war etwas detaillierter als ich dachte, las sie aber durch.

DLL:
In den meisten Fällen ist eine DLL-Datei eine Bibliothek . Es gibt verschiedene Arten von Bibliotheken, dynamische und statische - lesen Sie über den Unterschied . DLL steht für Dynamic Link Library, die uns sagt, dass es ein Teil des Programms ist, aber nicht das Ganze. Es besteht aus wiederverwendbaren Softwarekomponenten ( Bibliothek ), die Sie für mehr als ein einzelnes Programm verwenden können . Beachten Sie, dass es in vielen Anwendungen immer möglich ist, den Quellcode der Bibliothek mithilfe von Copy-Paste zu verwenden. Die Idee einer DLL / statischen Bibliothek besteht jedoch darin, dass Sie den Code einer Bibliothek aktualisieren und gleichzeitig alle Anwendungen mit aktualisieren können es - ohne zu kompilieren.

Beispiel:
Stellen Sie sich vor, Sie erstellen eine Windows-GUI-Komponente wie eine Schaltfläche . In den meisten Fällen möchten Sie den von Ihnen geschriebenen Code wiederverwenden, da es sich um eine komplexe, aber häufig vorkommende Komponente handelt. Sie möchten, dass viele Anwendungen ihn verwenden, möchten ihnen jedoch nicht den Quellcode geben, den Sie nicht kopieren können - Fügen Sie den Code für die Schaltfläche in jedes Programm ein, damit Sie eine DL-Bibliothek (DLL) erstellen möchten. .

Diese "Button" -Bibliothek wird von EXE benötigt Cutables zum Ausführen benötigt. Ohne sie werden sie nicht ausgeführt, da sie nicht wissen, wie sie die Schaltfläche erstellen, sondern nur, wie sie mit ihr sprechen.

Ebenso kann eine DLL nicht ausgeführt werden, da sie nur ein Teil des Programms ist, aber nicht über die Informationen verfügt, die zum Erstellen eines "Prozesses" erforderlich sind. .

EXE:
Eine ausführbare Datei ist das Programm . Es weiß, wie man einen Prozess erstellt und wie man mit der DLL spricht. Es benötigt die DLL, um eine Schaltfläche zu erstellen, und ohne sie wird die Anwendung nicht ausgeführt - ERROR.

hoffe das hilft....


Wenn Sie in der .NET-Entwicklungswelt Dinge aus anderen Modulen importieren, z. B. in C # using SomeClassFromALibrary, wird diese Bibliothek über eine DLL mit dem Projekt verknüpft. Ich versuche nur zu sehen, ob ich richtig verstehe
Abdul

16

Sowohl DLL als auch EXE sind PE-Formate (Portable Executable)

Eine Dynamic-Link-Bibliothek (DLL) ist eine Bibliothek und kann daher nicht direkt ausgeführt werden. Wenn Sie versuchen, es auszuführen, erhalten Sie eine Fehlermeldung über einen fehlenden Einstiegspunkt. Es benötigt einen Einstiegspunkt (Hauptfunktion), um ausgeführt zu werden. Dieser Einstiegspunkt kann eine beliebige Anwendung oder Exe sein. Die DLL-Bindung erfolgt zur Laufzeit. Deshalb heißt es "Dynamic Link" -Bibliothek.

Eine ausführbare Datei (EXE) ist ein Programm, das ausgeführt werden kann. Es hat einen eigenen Einstiegspunkt. Ein Flag im PE-Header gibt an, um welchen Dateityp es sich handelt (unabhängig von der Dateierweiterung). Der PE-Header enthält ein Feld, in dem sich der Einstiegspunkt für das Programm befindet. In DLLs wird es nicht verwendet (oder zumindest nicht als Einstiegspunkt).

Es gibt viele Software zur Überprüfung der Header-Informationen. Der einzige Unterschied, der dazu führt, dass beide unterschiedlich funktionieren, ist das Bit im Header, wie in der folgenden Abbildung gezeigt.

Header

Die EXE-Datei hat nur einen einzigen Haupteintrag. Dies bedeutet, dass es sich um eine isolierte Anwendung handelt. Wenn ein System exe startet, wird ein neuer Prozess erstellt, während DLLs viele Einstiegspunkte haben. Wenn die Anwendung sie verwendet, wird kein neuer Prozess gestartet. Die DLL kann wiederverwendet und versioniert werden. DLL reduziert den Speicherplatz, da verschiedene Programme dieselbe DLL verwenden können.


3
Sie sagen "Ein Flag im PE-Header gibt an, um welchen Dateityp es sich handelt (unabhängig von der Dateierweiterung)" --- Bedeutet das also, ob die Erweiterung eine Rolle spielt .exeoder .dllnicht? Es ist dieses Flag in der Kopfzeile, das sie wirklich auszeichnet. Wenn ich also ein Flag erstelle exeund es über die GUI-Interaktion .dllbenenne, aber dann dieses Flag manuell ändere, ist es immer noch lauffähig?
Abdul

4

Zwei Dinge: die Erweiterung und das Header-Flag, die in der Datei gespeichert sind.

Beide Dateien sind PE-Dateien. Beide enthalten genau das gleiche Layout. Eine DLL ist eine Bibliothek und kann daher nicht ausgeführt werden. Wenn Sie versuchen, es auszuführen, wird eine Fehlermeldung über einen fehlenden Einstiegspunkt angezeigt. Eine EXE ist ein Programm, das ausgeführt werden kann. Es hat einen Einstiegspunkt. Ein Flag im PE-Header gibt an, um welchen Dateityp es sich handelt (unabhängig von der Dateierweiterung). Der PE-Header enthält ein Feld, in dem sich der Einstiegspunkt für das Programm befindet. In DLLs wird es nicht verwendet (oder zumindest nicht als Einstiegspunkt).

Ein kleiner Unterschied besteht darin, dass DLLs in den meisten Fällen einen Exportabschnitt haben , in den Symbole exportiert werden. EXEs sollten niemals einen Exportabschnitt haben, da sie keine Bibliotheken sind, aber nichts verhindert dies. Dem Win32-Loader ist das egal.

Ansonsten sind sie identisch. Zusammenfassend sind EXEs ausführbare Programme, während DLLs Bibliotheken sind, die in einen Prozess geladen werden und nützliche Funktionen wie Sicherheit, Datenbankzugriff oder ähnliches enthalten.


3
+1: So wenige Leute erkennen, dass der Unterschied technisch gesehen nur ein Bit im PE-Header ist
Serge Wautier

Ich frage mich, was in einem Interview passieren würde, wenn Sie so antworten würden. Sie: "Was ist der Unterschied zwischen einer DLL und einer EXE?" Sie: "One Bit".
JMI MADISON

4

Dll v / s Exe

1) Die DLL-Datei ist eine dynamische Linkbibliothek, die in exe-Dateien und anderen DLL-Dateien verwendet werden kann.
Die EXE-Datei ist eine ausführbare Datei, die in einem separaten Prozess ausgeführt wird, der vom Betriebssystem verwaltet wird.

2) DLLs sind nicht direkt ausführbar. Dies sind separate Dateien mit Funktionen, die von Programmen und anderen DLLs aufgerufen werden können, um Berechnungen und Funktionen auszuführen.
Eine EXE ist ein Programm, das ausgeführt werden kann. Beispiel: Windows-Programm

3) Wiederverwendbarkeits-
DLL: Sie können für eine andere Anwendung wiederverwendet werden. Solange der Codierer die Namen und Parameter der Funktionen und Prozeduren in der DLL-Datei kennt.
EXE: Nur für einen bestimmten Zweck.

4) Eine DLL würde denselben Prozess und Speicherplatz der aufrufenden Anwendung gemeinsam nutzen, während eine
EXE-Datei ihren separaten Prozess- und Speicherbereich erstellt.

5) Verwendet
DLL: Sie möchten, dass viele Anwendungen es verwenden, aber Sie möchten ihnen nicht den Quellcode geben. Sie können den Code für die Schaltfläche nicht in jedem Programm kopieren und einfügen, also entscheiden Sie, dass Sie eine DL erstellen möchten. Bibliothek (DLL).

EXE: Wenn wir mit Projektvorlagen wie Windows Forms-Anwendungen, Konsolenanwendungen, WPF-Anwendungen und Windows-Diensten arbeiten, wird beim Kompilieren eine Exe-Assembly generiert.

6) Ähnlichkeiten:
Sowohl DLL als auch EXE sind Binärdateien mit einer komplexen verschachtelten Struktur, die durch das Format Portable Executable definiert ist, und sie können nicht von Benutzern bearbeitet werden.


2

Die .exe ist das Programm. Die DLL ist eine Bibliothek, in die eine EXE-Datei (oder eine andere DLL) aufrufen kann.

Was sakthivignesh sagt, kann darin zutreffen, dass eine .exe eine andere verwenden kann, als wäre es eine Bibliothek, und dies geschieht (zum Beispiel) mit einigen COM-Komponenten. In diesem Fall ist die "Slave" -Exe ein separates Programm (genau genommen ein separater Prozess - möglicherweise auf einem separaten Computer ausgeführt), der jedoch Anforderungen von anderen Programmen / Komponenten / was auch immer akzeptiert und verarbeitet.

Wenn Sie jedoch nur eine zufällige EXE- und DLL-Datei aus einem Ordner in Ihren Programmdateien auswählen, ist COM wahrscheinlich nicht relevant - es handelt sich lediglich um ein Programm und seine dynamisch verknüpften Bibliotheken.

Mithilfe von Win32-APIs kann ein Programm eine DLL mithilfe der LoadLibrary- und GetProcAddress-API-Funktionen IIRC laden und verwenden. In Win16 gab es ähnliche Funktionen.

COM ist in vielerlei Hinsicht eine Weiterentwicklung der DLL-Idee, die ursprünglich als Grundlage für OLE2 gedacht war, während .NET der Nachkomme von COM ist. DLLs gibt es seit Windows 1, IIRC. Sie waren ursprünglich eine Möglichkeit, Binärcode (insbesondere System-APIs) zwischen mehreren laufenden Programmen zu teilen, um die Speichernutzung zu minimieren.


2

Eine EXE-Datei ist für das System als reguläre ausführbare Win32-Datei sichtbar. Der Einstiegspunkt bezieht sich auf einen kleinen Loader, der die .NET-Laufzeit initialisiert und anweist, die in der EXE enthaltene Assembly zu laden und auszuführen. Eine DLL ist für das System als Win32-DLL sichtbar, jedoch höchstwahrscheinlich ohne Einstiegspunkte. Die .NET-Laufzeit speichert Informationen zur enthaltenen Assembly in einem eigenen Header.

DLL ist eine Sammlung wiederverwendbarer Funktionen, wobei eine EXE-Datei eine ausführbare Datei ist, die diese Funktionen aufrufen kann


1
Die .NET-Laufzeit hat nichts mit .exe oder .dll zu tun, es handelt sich um binäre Maschinencodedateien (Wenn diese in einer Programmiersprache erstellt werden, die .NET-Laufzeit verwendet, ist die .NET-Laufzeit beteiligt, dies liegt jedoch bereits in der Verantwortung von exe Code selbst, nicht OS Loader).
Ped7g

1

● .exe und dll sind die kompilierte Version von c # -Code, die auch als Assemblys bezeichnet werden.

● .exe ist eine eigenständige ausführbare Datei, die direkt ausgeführt werden kann.

● .dll ist eine wiederverwendbare Komponente, die nicht direkt ausgeführt werden kann und für deren Ausführung andere Programme erforderlich sind.


0

Eine exe ist ein ausführbares Programm, während eine DLL eine Datei ist, die von Programmen dynamisch geladen und ausgeführt werden kann.


6
Jemand hatte wahrscheinlich das Gefühl, dass Ihre Antwort nicht detailliert genug war.
JesperE

Ja, die Leute wissen vielleicht nicht, was ein ausführbares Programm ist, und das wird selbst zu einer ganz neuen Frage.
Mindless

0

Unterschied in DLL und EXE:

1) DLL ist eine In-Process-Komponente, dh sie wird im selben Speicherbereich wie der Client-Prozess ausgeführt. EXE ist eine Out-Process-Komponente, dh sie wird in einem separaten Speicherbereich ausgeführt.

2) Die DLL enthält Funktionen und Prozeduren, die andere Programme verwenden können (fördert die Wiederverwendbarkeit), während EXE nicht mit anderen Programmen geteilt werden kann.

3) DLL kann nicht direkt ausgeführt werden, da sie zum Laden und Ausführen durch andere Programme ausgelegt sind. EXE ist ein Programm, das direkt ausgeführt wird.


-1

Bitte kommentieren Sie während der Abstimmung.

Für diejenigen, die eine präzise Antwort suchen,

  • Wenn eine Assembly als Klassenbibliothek kompiliert wird und Typen für andere Assemblys bereitstellt, hat sie die ifle-Erweiterung .dll (Dynamic Link Library) und kann nicht eigenständig ausgeführt werden.

  • Wenn eine Assembly als Anwendung kompiliert wird, hat sie die Dateierweiterung .exe(ausführbar) und kann eigenständig ausgeführt werden. Vor .NET Core 3.0 wurden Konsolen-Apps zu DLL-Dateien kompiliert und mussten mit dem Befehl dotnet run oder einer ausführbaren Host-Datei ausgeführt werden. - Quelle


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.