Différence entre .dll et .exe?

91

Je veux connaître la différence exacte entre le fichier dll et exe.

Umesh Aawte
la source
1
Vous devriez ajouter un peu de contexte ici: Êtes-vous un débutant Cherchez-vous une sorte de spécification technique approfondie du matériel PE Ou autre chose
khebbie
3
C'est vrai que je suis débutant. C'est une question d'entretien comme taguée.
Umesh Aawte
Plus important encore, il s'agit d'un double dont un (supprimé) par sakthivignesh ...
Marc Gravell

Réponses:

71

EXE:

  1. C'est un fichier exécutable
  2. Lors du chargement d'un exécutable, aucune exportation n'est appelée, mais uniquement le point d'entrée du module.
  3. Lorsqu'un système lance un nouvel exécutable, un nouveau processus est créé
  4. Le thread d'entrée est appelé dans le contexte du thread principal de ce processus.

DLL:

  1. C'est une bibliothèque de liens dynamiques
  2. Il existe plusieurs symboles exportés.
  3. Le système charge une DLL dans le contexte d'un processus existant.

Pour plus de détails: 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_EXE_and_a_DLL

Référence: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx

premier pouce
la source
9
Le système charge une DLL dans un PROCESSUS existant, pas dans un thread. Chaque DLL d'un processus peut recevoir une notification lorsqu'un thread démarre ou s'arrête, via une LibMainfonction.
Daniel Earwicker
13
Vos points 1 et 2 ne sont pas corrects à 100%. Comme vous pouvez utiliser LoadLibraryEx sur un exe ou une dll, cela signifie que vous pouvez utiliser GetProcAddress pour charger un point d'entrée à partir d'un exe ou d'une dll. Donc, à cet égard, les fichiers exe et dll peuvent être liés dynamiquement et peuvent avoir n'importe quel nombre de points d'entrée.
jussij
132

Je ne sais pas pourquoi tout le monde répond à cette question dans le contexte de .NET. La question était d'ordre général et ne mentionnait nulle part .NET.

Eh bien, les principales différences sont:

EXE

  1. Un exe s'exécute toujours dans son propre espace d'adressage, c'est-à-dire qu'il s'agit d'un processus distinct.
  2. Le but d'un EXE est de lancer sa propre application.

DLL

  1. Une dll a toujours besoin d'un exe hôte pour s'exécuter. c'est-à-dire qu'il ne peut jamais fonctionner dans son propre espace d'adressage.
  2. Le but d'une DLL est d'avoir une collection de méthodes / classes qui peuvent être réutilisées à partir d'une autre application.
  3. DLL est l'implémentation par Microsoft d'une bibliothèque partagée.

Le format de fichier DLL et exe est essentiellement le même. Windows reconnaît la différence entre DLL et EXE via l'en-tête PE dans le fichier. Pour plus de détails sur l'en-tête PE, vous pouvez consulter cet article sur MSDN

Aamir
la source
4
Donc, si vous vouliez que vous puissiez renommer et modifier l'en-tête du fichier pour transformer une dll en un exe et vice versa?
RCIX
@RCIX: Je doute que ce soit possible?
VoodooChild
Ce n'est probablement pas possible - voir la réponse de Kichik ci-dessous.
Jonathon Reinhart
31

La différence est qu'un EXE a un point d'entrée, une méthode "principale" qui s'exécutera lors de l'exécution.

Le code d'une DLL doit être appelé à partir d'une autre application.

Jour de Robin
la source
11
C'est une erreur de chargement, cela implique que les DLL n'ont pas de points d'entrée. Les DLL peuvent avoir un point d'entrée DLLMain qui est appelé lorsque (entre autres choses) la DLL est chargée dans le processus
jay.lee
29

Il y a quelques autres différences concernant la structure que vous pourriez mentionner.

  1. DLL et EXE partagent la même structure de fichiers - Portable Executable ou PE. Pour différencier les deux, on peut regarder dans le Characteristicsmembre de l' IMAGE_FILE_HEADERintérieur IMAGE_NT_HEADERS. Pour une DLL, l' IMAGE_FILE_DLLindicateur (0x2000) est activé. Pour un EXE, c'est le IMAGE_FILE_EXECUTABLE_IMAGEdrapeau (0x2).
  2. Les fichiers PE se composent de certains en-têtes et de plusieurs sections. Il y a généralement une section pour le code, une section pour les données, une section répertoriant les fonctions importées et une section pour les ressources. Certaines sections peuvent contenir plus d'un élément. L'en-tête décrit également une liste de répertoires de données qui se trouvent dans les sections. Ces répertoires de données permettent à Windows de trouver ce dont il a besoin dans le PE. Mais un type de répertoire de données qu'un EXE n'aura jamais (à moins que vous ne construisiez un EXE frankenstein) est le répertoire d'exportation. C'est là que les fichiers DLL ont une liste de fonctions qu'ils exportent et peuvent être utilisés par d'autres fichiers EXE ou DLL. De l'autre côté, chaque DLL et EXE a un répertoire d'importation où il répertorie les fonctions et les fichiers DLL dont il a besoin pour s'exécuter.
  3. Le membre IMAGE_OPTIONAL_HEADERest également dans les en-têtes PE ( ) ImageBase. Il spécifie l'adresse virtuelle à laquelle le PE suppose qu'il sera chargé. S'il est chargé à une autre adresse, certains pointeurs peuvent pointer vers la mauvaise mémoire. Comme les fichiers EXE sont parmi les premiers à être chargés dans leur nouvel espace d'adressage, le chargeur Windows peut assurer une adresse de chargement constante, généralement 0x00400000. Ce luxe n'existe pas pour une DLL. Deux fichiers DLL chargés dans le même processus peuvent demander la même adresse. C'est pourquoi une DLL a un autre répertoire de données appelé Répertoire de réinstallation de base qui réside généralement dans sa propre section - .reloc. Ce répertoire contient une liste des emplacements de la DLL qui doivent être rebasés / corrigés afin qu'ils pointent vers la bonne mémoire. La plupart des fichiers EXE n'ont pas ce répertoire, mais certains anciens compilateurs les génèrent.

Vous pouvez en savoir plus sur ce sujet @ MSDN .

kichik
la source
1
1. Comme ce sont des drapeaux, les deux peuvent être définis en même temps. 2. Comme vous l'avez dit, c'est possible mais extrêmement improbable. 3. ASLR déplacera également l'exe, s'il le peut. Alors oui, même un exe peut avoir des déménagements. Dans l'ensemble, les EXE qui sont des DLL sont possibles mais rares .
Deduplicator
20

Cette réponse était un peu plus détaillée que je ne le pensais, mais lisez-la attentivement.

DLL:
dans la plupart des cas, un fichier DLL est une bibliothèque . Il existe plusieurs types de bibliothèques, dynamiques et statiques - lisez la différence . DLL signifie bibliothèque de liens dynamiques qui nous dit que cela fait partie du programme mais pas le tout. Il est composé de composants logiciels réutilisables ( bibliothèque ) que vous pouvez utiliser pour plusieurs programmes . Gardez à l'esprit qu'il est toujours possible d'utiliser le code source de la bibliothèque dans de nombreuses applications en utilisant le copier-coller, mais l'idée d'une DLL / bibliothèque statique est que vous pouvez mettre à jour le code d'une bibliothèque et en même temps mettre à jour toutes les applications en utilisant il - sans compiler.

Par exemple:
imaginez que vous créez un composant d'interface graphique Windows comme un bouton . Dans la plupart des cas, vous voudrez réutiliser le code que vous avez écrit car il s'agit d'un composant complexe mais courant - Vous voulez que de nombreuses applications l'utilisent mais vous ne voulez pas leur donner le code source Vous ne pouvez pas copier - collez le code du bouton dans chaque programme, vous décidez donc que vous souhaitez créer une DL-Library (DLL) .

Cette bibliothèque de "boutons" est requise par les cutables EXE pour s'exécuter, et sans elle, ils ne fonctionneront pas car ils ne savent pas comment créer le bouton, mais seulement comment lui parler.

De même, une DLL ne peut pas être exécutée - exécutée, car ce n'est qu'une partie du programme mais ne dispose pas des informations nécessaires pour créer un «processus» .

EXE:
un exécutable est le programme . Il sait comment créer un processus et comment parler à la DLL. Il a besoin de la DLL pour créer un bouton, et sans elle l'application ne s'exécute pas - ERREUR.

J'espère que cela t'aides....

Hannson
la source
Dans le monde du développement .NET, lorsque vous importez des éléments à partir d'autres modules, comme par exemple en C # using SomeClassFromALibrary, cette bibliothèque est liée au projet via une DLL? J'essaie juste de voir si je comprends bien
Abdul
Vous utilisez normalement le mot-clé usingpour les espaces de noms, pas pour les classes. L'exception est using staticdisponible à partir de c # 6 qui importe tous les membres statiques présents dans la classe spécifiée ( lien ). Le usingmot-clé promet au compilateur qu'au moment de l'exécution, il y aura une bibliothèque contenant cet espace de noms . La bibliothèque n'est pas liée au projet via cette DLL, la DLL est la bibliothèque liée au projet (assemblage). Cette DLL contient tout le code promis au moment de la compilation.
Darius
16

DLL et EXE sont des formats exécutables portables (PE)

Une bibliothèque de liens dynamiques (DLL) est une bibliothèque et ne peut donc pas être exécutée directement. Si vous essayez de l'exécuter, vous obtiendrez une erreur concernant un point d'entrée manquant. Il a besoin d'un point d'entrée (fonction principale) pour être exécuté, ce point d'entrée peut être n'importe quelle application ou exe. La liaison DLL se produit au moment de l'exécution. C'est pourquoi sa bibliothèque appelée "Dynamic Link".

Un exécutable (EXE) est un programme qui peut être exécuté. Il a son propre point d'entrée. Un indicateur à l'intérieur de l'en-tête PE indique de quel type de fichier il s'agit (sans rapport avec l'extension de fichier). L'en-tête PE a un champ où réside le point d'entrée du programme. Dans les DLL, il n'est pas utilisé (ou du moins pas comme point d'entrée).

Il existe de nombreux logiciels disponibles pour vérifier les informations d'en-tête. La seule différence qui fait que les deux fonctionnent différemment est le bit dans l'en-tête comme indiqué dans le diagramme ci-dessous.

entête

Le fichier EXE n'a qu'une seule entrée principale signifie qu'il s'agit d'une application isolée, lorsqu'un système lance un exe, un nouveau processus est créé tandis que les DLL ont de nombreux points d'entrée.Ainsi, lorsque l'application l'utilise, aucun nouveau processus ne démarre, la DLL peut être réutilisée et versionnée. DLL réduit l'espace de stockage car différents programmes peuvent utiliser la même DLL.

Zaheer Ahmed
la source
3
Vous dites "Un drapeau à l'intérieur de l'en-tête PE indique de quel type de fichier il s'agit (sans rapport avec l'extension de fichier)" --- Cela signifie-t-il si l'extension est importante .exeou .dllnon? C'est cet indicateur dans l'en-tête qui les distingue vraiment ... Donc, si je crée un exeet le nomme via une interaction GUI comme un .dll, mais que je change ensuite cet indicateur manuellement, il est toujours exécutable?
Abdul
4

Deux choses: l'extension et l'indicateur d'en-tête stockés dans le fichier.

Les deux fichiers sont des fichiers PE. Les deux contiennent exactement la même disposition. Une DLL est une bibliothèque et ne peut donc pas être exécutée. Si vous essayez de l'exécuter, vous obtiendrez une erreur concernant un point d'entrée manquant. Un EXE est un programme qui peut être exécuté. Il a un point d'entrée. Un indicateur à l'intérieur de l'en-tête PE indique de quel type de fichier il s'agit (sans rapport avec l'extension de fichier). L'en-tête PE a un champ où réside le point d'entrée du programme. Dans les DLL, il n'est pas utilisé (ou du moins pas comme point d'entrée).

Une différence mineure est que dans la plupart des cas, les DLL ont une section d'exportation où les symboles sont exportés. Les EXE ne devraient jamais avoir de section d'exportation car ils ne sont pas des bibliothèques mais rien n'empêche que cela se produise. Le chargeur Win32 ne se soucie pas de toute façon.

A part ça, ils sont identiques. Donc, en résumé, les EXE sont des programmes exécutables tandis que les DLL sont des bibliothèques chargées dans un processus et contiennent une sorte de fonctionnalité utile comme la sécurité, l'accès à la base de données ou autre.

Judy Smith
la source
3
+1: Si peu de gens se rendent compte que techniquement, la différence n'est qu'un peu dans l'en-tête PE
Serge Wautier
Je me demande ce qui se passerait dans une interview si vous répondiez de cette façon. Eux: "Quelle est la différence entre une DLL et un EXE?" Vous: "One Bit".
JMI MADISON
4

Dll v / s Exe

1) Le fichier DLL est une bibliothèque de liens dynamiques qui peut être utilisée dans des fichiers exe et d'autres fichiers dll.
Le fichier EXE est un fichier exécutable qui s'exécute dans un processus distinct géré par le système d'exploitation.

2) Les DLL ne sont pas directement exécutables. Ce sont des fichiers séparés contenant des fonctions qui peuvent être appelées par des programmes et d'autres DLL pour effectuer des calculs et des fonctions.
Un EXE est un programme qui peut être exécuté. Ex: programme Windows

3)
DLL de réutilisation : elles peuvent être réutilisées pour une autre application. Tant que le codeur connaît les noms et les paramètres des fonctions et des procédures dans le fichier DLL.
EXE: uniquement à des fins spécifiques.

4) Une DLL partagerait le même processus et l'espace mémoire de l'application appelante tandis qu'un
EXE crée son processus et son espace mémoire séparés.

5) Utilise la
DLL: vous voulez que de nombreuses applications l'utilisent mais vous ne voulez pas leur donner le code source Vous ne pouvez pas copier-coller le code du bouton dans chaque programme, vous décidez donc que vous voulez créer un DL- Bibliothèque (DLL).

EXE: Lorsque nous travaillons avec des modèles de projet tels que les applications Windows Forms, les applications console, les applications WPF et les services Windows, ils génèrent un assemblage exe lors de la compilation.

6) Similitudes:
DLL et EXE sont des fichiers binaires ayant une structure imbriquée complexe définie par le format Portable Executable, et ils ne sont pas destinés à être modifiables par les utilisateurs.

skanda93
la source
2

Le .exe est le programme. Le .dll est une bibliothèque dans laquelle un .exe (ou un autre .dll) peut appeler.

Ce que dit sakthivignesh peut être vrai en ce qu'un .exe peut en utiliser un autre comme s'il s'agissait d'une bibliothèque, et cela se fait (par exemple) avec certains composants COM. Dans ce cas, le "slave" .exe est un programme séparé (à proprement parler, un processus séparé - peut-être exécuté sur une machine séparée), mais qui accepte et gère les demandes d'autres programmes / composants / quoi que ce soit.

Cependant, si vous choisissez simplement un .exe et un .dll aléatoires dans un dossier de vos fichiers programme, il y a de fortes chances que COM ne soit pas pertinent - il ne s'agit que d'un programme et de ses bibliothèques liées dynamiquement.

À l'aide des API Win32, un programme peut charger et utiliser une DLL à l'aide des fonctions API LoadLibrary et GetProcAddress, IIRC. Il y avait des fonctions similaires dans Win16.

COM est à bien des égards une évolution de l'idée de DLL, initialement conçue comme la base de OLE2, alors que .NET est le descendant de COM. Les DLL existent depuis Windows 1, IIRC. Ils étaient à l'origine un moyen de partager du code binaire (en particulier les API système) entre plusieurs programmes en cours d'exécution afin de minimiser l'utilisation de la mémoire.

Steve314
la source
2

Un EXE est visible par le système comme un exécutable Win32 normal. Son point d'entrée fait référence à un petit chargeur qui initialise le runtime .NET et lui dit de charger et d'exécuter l'assembly contenu dans le fichier EXE. Une DLL est visible par le système en tant que DLL Win32, mais probablement sans aucun point d'entrée. Le runtime .NET stocke les informations sur l'assembly contenu dans son propre en-tête.

dll est une collection de fonctions réutilisables où en tant que .exe est un exécutable qui peut appeler ces fonctions

rahul
la source
1
Le runtime .NET n'a rien à voir avec .exe ou .dll, ce sont des fichiers de code machine binaire (si ceux-ci sont produits dans un langage de programmation qui utilise le runtime .NET, alors le runtime .NET est impliqué, mais c'est déjà la responsabilité du exe lui-même, pas le chargeur du système d'exploitation).
Ped7g
1

Un exe est un programme exécutable tandis qu'une DLL est un fichier qui peut être chargé et exécuté par des programmes de manière dynamique.

Bhushan Bhangale
la source
6
Quelqu'un a probablement estimé que votre réponse n'était pas assez détaillée.
JesperE
oui, les gens peuvent ne pas savoir ce qu'est un programme exécutable, et cela devient une toute nouvelle question en soi.
Mindless
1

● .exe et dll sont la version compilée du code c # qui sont également appelés assemblys.

● .exe est un fichier exécutable autonome, ce qui signifie qu'il peut être exécuté directement.

● .dll est un composant réutilisable qui ne peut pas être exécuté directement et qui nécessite d'autres programmes pour l'exécuter.

Kedarnath MS
la source
0

Différence entre DLL et EXE:

1) DLL est un composant en cours d'exécution, ce qui signifie qu'il s'exécute dans le même espace mémoire que le processus client. EXE est un composant Out-Process, ce qui signifie qu'il s'exécute dans son propre espace mémoire séparé.

2) La DLL contient des fonctions et des procédures que d'autres programmes peuvent utiliser (favorise la réutilisation) alors qu'EXE ne peut pas être partagé avec d'autres programmes.

3) Les DLL ne peuvent pas être exécutées directement car elles sont conçues pour être chargées et exécutées par d'autres programmes. EXE est un programme exécuté directement.

rahul sharma
la source
-1

Veuillez commenter lors du vote négatif.

Pour ceux qui recherchent une réponse concise,

  • Si un assembly est compilé en tant que bibliothèque de classes et fournit des types pour d'autres assemblys à utiliser, alors il a l'extension ifle .dll (bibliothèque de liens dynamiques), et il ne peut pas être exécuté de manière autonome.

  • De même, si un assembly est compilé en tant qu'application, alors il a l'extension de fichier .exe(exécutable) et peut être exécuté de manière autonome. Avant .NET Core 3.0, les applications de console étaient compilées dans des fichiers .dll et devaient être exécutées par la commande dotnet run ou un exécutable hôte. - Source

snr
la source
-2

La principale différence exacte entre DLL et EXE est que DLL n'a pas de point d'entrée et EXE. Si vous êtes familier avec C ++, vous pouvez voir que build EXE a la fonction d'entrée main () et que DLL ne le fait pas :)

faya
la source