Differenza tra .dll e .exe?


91

Voglio sapere la differenza esatta tra il file dll e exe.


1
Dovresti aggiungere un po 'di contesto qui: Sei un principiante Stai cercando una sorta di specifica tecnica profonda del materiale PE o qualcos'altro
khebbie

3
È vero che sono un principiante. È una domanda da intervista come etichettata.
Umesh Aawte

Ancora più importante, questo è un duplicato incluso uno (cancellato) di sakthivignesh ...
Marc Gravell

Risposte:


71

EXE:

  1. È un file eseguibile
  2. Quando si carica un eseguibile, non viene chiamata alcuna esportazione, ma solo il punto di ingresso del modulo.
  3. Quando un sistema avvia un nuovo eseguibile, viene creato un nuovo processo
  4. Il thread di ingresso viene chiamato nel contesto del thread principale di quel processo.

DLL:

  1. È una libreria di collegamento dinamico
  2. Sono presenti più simboli esportati.
  3. Il sistema carica una DLL nel contesto di un processo esistente.

Per ulteriori dettagli: 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

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


9
Il sistema carica una DLL in un PROCESSO esistente, non in un thread. Ogni DLL in un processo può ricevere una notifica all'avvio o all'arresto di un thread, tramite una LibMainfunzione.
Daniel Earwicker

13
I tuoi punti 1 e 2 non sono corretti al 100%. Poiché è possibile utilizzare LoadLibraryEx su un exe o dll, ciò significa che è possibile utilizzare GetProcAddress per caricare un punto di ingresso da un exe o da una dll. Quindi, a questo proposito, sia i file exe che dll possono essere collegati dinamicamente e possono avere un numero qualsiasi di punti di ingresso.
jussij

132

Non so perché tutti rispondano a questa domanda nel contesto di .NET. La domanda era generale e non menzionava .NET da nessuna parte.

Ebbene, le principali differenze sono:

EXE

  1. Un exe viene sempre eseguito nel proprio spazio degli indirizzi, ovvero è un processo separato.
  2. Lo scopo di un EXE è avviare una propria applicazione separata.

DLL

  1. Una dll necessita sempre di un file exe host per essere eseguita. cioè, non può mai essere eseguito nel proprio spazio degli indirizzi.
  2. Lo scopo di una DLL è di avere una raccolta di metodi / classi che possono essere riutilizzati da qualche altra applicazione.
  3. DLL è l'implementazione di Microsoft di una libreria condivisa.

Il formato di file di DLL ed exe è essenzialmente lo stesso. Windows riconosce la differenza tra DLL ed EXE tramite l'intestazione PE nel file. Per i dettagli sull'intestazione PE, puoi dare un'occhiata a questo articolo su MSDN


4
Quindi, se volessi rinominare e modificare l'intestazione del fikle per trasformare una dll in un exe e viceversa?
RCIX

@RCIX: dubito che sia possibile?
VoodooChild

Molto probabilmente non è possibile - vedi la risposta di kichik di seguito.
Jonathon Reinhart

31

La differenza è che un EXE ha un punto di ingresso, un metodo "principale" che verrà eseguito durante l'esecuzione.

Il codice all'interno di una DLL deve essere chiamato da un'altra applicazione.


11
Questo è un caricamento errato, implica che le DLL non hanno punti di ingresso. Le DLL possono avere un punto di ingresso DLLMain che viene chiamato quando (tra le altre cose) la DLL viene caricata nel processo
jay.lee

29

Ci sono alcune altre differenze riguardanti la struttura che potresti menzionare.

  1. Sia DLL che EXE condividono la stessa struttura di file: Portable Executable o PE. Per distinguere tra i due, si può guardare nella Characteristicsparte IMAGE_FILE_HEADERinterna IMAGE_NT_HEADERS. Per una DLL, ha il IMAGE_FILE_DLLflag (0x2000) attivato. Per un EXE è il IMAGE_FILE_EXECUTABLE_IMAGEflag (0x2).
  2. I file PE sono costituiti da alcune intestazioni e da un numero di sezioni. Di solito c'è una sezione per il codice, una sezione per i dati, una sezione che elenca le funzioni importate e una sezione per le risorse. Alcune sezioni possono contenere più di una cosa. L'intestazione descrive anche un elenco di directory di dati che si trovano nelle sezioni. Queste directory di dati sono ciò che consente a Windows di trovare ciò di cui ha bisogno nel PE. Ma un tipo di directory di dati che un EXE non avrà mai (a meno che tu non stia costruendo un EXE di Frankenstein) è la directory di esportazione. Qui è dove i file DLL hanno un elenco di funzioni che esportano e possono essere utilizzati da altri file EXE o DLL. Dall'altro lato, ogni DLL ed EXE ha una directory di importazione in cui elenca le funzioni e i file DLL necessari per l'esecuzione.
  3. Anche nelle intestazioni PE ( IMAGE_OPTIONAL_HEADER) è il ImageBasemembro. Specifica l'indirizzo virtuale in cui il PE presume che verrà caricato. Se viene caricato in un altro indirizzo, alcuni puntatori potrebbero puntare alla memoria sbagliata. Poiché i file EXE sono tra i primi a essere caricati nel nuovo spazio degli indirizzi, il caricatore di Windows può garantire un indirizzo di caricamento costante e di solito è 0x00400000. Quel lusso non esiste per una DLL. Due file DLL caricati nello stesso processo possono richiedere lo stesso indirizzo. Questo è il motivo per cui una DLL ha un'altra directory di dati chiamata Base Relocation Directory che di solito risiede nella propria sezione - .reloc. Questa directory contiene un elenco di posizioni nella DLL che devono essere ribasate / corrette in modo che puntino alla memoria corretta. La maggior parte dei file EXE non ha questa directory, ma alcuni vecchi compilatori li generano.

Puoi leggere di più su questo argomento @ MSDN .


1
1. Poiché si tratta di flag, è possibile impostarli entrambi contemporaneamente. 2. Come hai detto, è possibile ma incredibilmente improbabile. 3. ASLR trasferirà anche l'exe, se possibile. Quindi sì, anche un exe può avere trasferimenti. Tutto sommato, gli EXE che sono DLL sono possibili ma rari .
Deduplicatore

20

Questa risposta è stata un po 'più dettagliata di quanto pensassi, ma l'ho letta.

DLL:
nella maggior parte dei casi, un file DLL è una libreria . Esistono un paio di tipi di librerie, dinamiche e statiche: leggi la differenza . DLL sta per libreria di collegamento dinamico che ci dice che fa parte del programma ma non del tutto. È costituito da componenti software riutilizzabili ( libreria ) che potresti utilizzare per più di un singolo programma . Tieni presente che è sempre possibile utilizzare il codice sorgente della libreria in molte applicazioni utilizzando il copia-incolla, ma l'idea di una libreria DLL / statica è che potresti aggiornare il codice di una libreria e allo stesso tempo aggiornare tutte le applicazioni utilizzando it - senza compilare.

Ad esempio:
immagina di creare un componente della GUI di Windows come un pulsante . Nella maggior parte dei casi vorresti riutilizzare il codice che hai scritto perché è un componente complesso ma comune - Vuoi che molte applicazioni lo usino ma non vuoi dare loro il codice sorgente Non puoi copiare -incolla il codice per il pulsante in ogni programma, così decidi di voler creare una libreria DL (DLL) .

Questa libreria di "pulsanti" è richiesta da EXE cutables per funzionare, e senza di essa non funzioneranno perché non sanno come creare il pulsante, ma solo come parlargli.

Allo stesso modo, una DLL non può essere eseguita - esegui, perché è solo una parte del programma ma non ha le informazioni necessarie per creare un "processo" .

EXE:
un eseguibile è il programma . Sa come creare un processo e come dialogare con la DLL. Ha bisogno della DLL per creare un pulsante e senza di essa l'applicazione non viene eseguita - ERRORE.

spero che questo ti aiuti....


Nel mondo dello sviluppo .NET, quando importi cose da altri moduli, come ad esempio in C # using SomeClassFromALibrary, quella libreria è collegata al progetto tramite una DLL? Sto solo cercando di vedere se sto capendo correttamente
Abdul

Normalmente usi la parola chiave usingper gli spazi dei nomi, non per le classi. L'eccezione è using staticdisponibile da c # 6 che importa tutti i membri statici presenti nella classe specificata ( collegamento ). La usingparola chiave promette al compilatore che in fase di esecuzione ci sarà una libreria contenente quello spazio dei nomi . La libreria non è collegata al progetto tramite quella DLL, la DLL è la libreria che è collegata al progetto (assembly). Quella DLL contiene tutto il codice che è stato promesso in fase di compilazione.
Darius

16

Sia DLL che EXE sono formati PE (Portable Executable)

Una libreria a collegamento dinamico (DLL) è una libreria e pertanto non può essere eseguita direttamente. Se si tenta di eseguirlo, verrà visualizzato un errore relativo a un punto di ingresso mancante. Ha bisogno di un punto di ingresso (funzione principale) per essere eseguito, quel punto di ingresso può essere qualsiasi applicazione o exe. Il binding DLL si verifica in fase di esecuzione. Questo è il motivo per cui è chiamata libreria "Dynamic Link".

Un eseguibile (EXE) è un programma che può essere eseguito. Ha il suo punto di ingresso. Un flag all'interno dell'intestazione PE indica il tipo di file che è (irrilevante dell'estensione del file). L'intestazione PE ha un campo in cui risiede il punto di ingresso per il programma. Nelle DLL non viene utilizzato (o almeno non come punto di ingresso).

Sono disponibili molti software per controllare le informazioni di intestazione. L'unica differenza che fa funzionare entrambi in modo diverso è il bit nell'intestazione come mostrato nel diagramma sottostante.

intestazione

Il file EXE ha solo una singola voce principale significa che è un'applicazione isolata, quando un sistema avvia exe, viene creato un nuovo processo mentre le DLL hanno molti punti di ingresso, quindi quando l'applicazione lo utilizza non viene avviato alcun nuovo processo, la DLL può essere riutilizzata e con versione. La DLL riduce lo spazio di archiviazione poiché diversi programmi possono utilizzare la stessa DLL.


3
Dici "Un flag all'interno dell'intestazione PE indica il tipo di file che è (irrilevante dell'estensione del file)" --- Quindi questo significa se l'estensione è .exeo .dllmeno importante? È quel flag nell'intestazione che li distingue veramente ... Quindi se creo un exee lo nomino tramite l'interazione GUI come a .dll, ma poi cambio quel flag manualmente, è ancora eseguibile?
Abdul

4

Due cose: l'estensione e il flag di intestazione memorizzati nel file.

Entrambi i file sono file PE. Entrambi contengono lo stesso identico layout. Una DLL è una libreria e quindi non può essere eseguita. Se provi a eseguirlo, riceverai un errore su un punto di ingresso mancante. Un EXE è un programma che può essere eseguito. Ha un punto di ingresso. Un flag all'interno dell'intestazione PE indica il tipo di file (irrilevante dell'estensione del file). L'intestazione PE ha un campo in cui risiede il punto di ingresso per il programma. Nelle DLL non viene utilizzato (o almeno non come punto di ingresso).

Una piccola differenza è che nella maggior parte dei casi le DLL hanno una sezione di esportazione in cui vengono esportati i simboli. Gli EXE non dovrebbero mai avere una sezione di esportazione poiché non sono librerie, ma nulla impedisce che ciò accada. Il caricatore Win32 non si preoccupa in alcun modo.

Oltre a questo sono identici. Quindi, in sintesi, gli EXE sono programmi eseguibili mentre le DLL sono librerie caricate in un processo e contengono una sorta di funzionalità utile come sicurezza, accesso al database o qualcosa del genere.


3
+1: Così poche persone si rendono conto che tecnicamente, la differenza è solo un po 'nell'intestazione PE
Serge Wautier

Mi chiedo cosa succederebbe in un'intervista se rispondessi in questo modo. Loro: "Qual è la differenza tra una DLL e un EXE?" Tu: "One Bit".
JMI MADISON

4

Dll v / s Exe

1) Il file DLL è una libreria di collegamento dinamico che può essere utilizzata nei file exe e in altri file dll.
Il file EXE è un file eseguibile che viene eseguito in un processo separato gestito dal sistema operativo.

2) Le DLL non sono eseguibili direttamente. Sono file separati contenenti funzioni che possono essere chiamate da programmi e altre DLL per eseguire calcoli e funzioni.
Un EXE è un programma che può essere eseguito. Es: programma Windows

3)
DLL di riusabilità : possono essere riutilizzate per altre applicazioni. Fintanto che il programmatore conosce i nomi ei parametri delle funzioni e delle procedure nel file DLL.
EXE: solo per scopi specifici.

4) Una DLL condivide lo stesso processo e lo stesso spazio di memoria dell'applicazione chiamante mentre un
EXE crea il suo processo separato e lo spazio di memoria.

5) Usa
DLL: vuoi che molte applicazioni lo usino ma non vuoi dare loro il codice sorgente Non puoi copiare e incollare il codice per il pulsante in ogni programma, quindi decidi di creare un DL- Libreria (DLL).

EXE: quando lavoriamo con modelli di progetto come applicazioni Windows Form, applicazioni console, applicazioni WPF e servizi Windows, generano un assembly exe quando vengono compilati.

6) Somiglianze:
Sia la DLL che l'EXE sono file binari che hanno una complessa struttura nidificata definita dal formato Portable Executable e non possono essere modificati dagli utenti.


2

Il .exe è il programma. Il .dll è una libreria in cui può chiamare un .exe (o un altro .dll).

Ciò che sakthivignesh dice può essere vero in quel .exe può usarne un altro come se fosse una libreria, e questo viene fatto (ad esempio) con alcuni componenti COM. In questo caso, lo "slave" .exe è un programma separato (in senso stretto, un processo separato - forse in esecuzione su una macchina separata), ma che accetta e gestisce le richieste da altri programmi / componenti / qualunque cosa.

Tuttavia, se scegli solo un .exe e un .dll casuali da una cartella nei tuoi Programmi, le probabilità sono che COM non sia rilevante: sono solo un programma e le sue librerie collegate dinamicamente.

Utilizzando le API Win32, un programma può caricare e utilizzare una DLL utilizzando le funzioni API LoadLibrary e GetProcAddress, IIRC. C'erano funzioni simili in Win16.

COM è per molti versi un'evoluzione dell'idea di DLL, originariamente concepita come base per OLE2, mentre .NET è il discendente di COM. Le DLL esistono da Windows 1, IIRC. In origine erano un modo per condividere il codice binario (in particolare le API di sistema) tra più programmi in esecuzione al fine di ridurre al minimo l'utilizzo della memoria.


2

Un EXE è visibile al sistema come un normale eseguibile Win32. Il suo punto di ingresso si riferisce a un piccolo caricatore che inizializza il runtime .NET e gli dice di caricare ed eseguire l'assembly contenuto nell'EXE. Una DLL è visibile al sistema come una DLL Win32 ma molto probabilmente senza punti di ingresso. Il runtime .NET memorizza le informazioni sull'assembly contenuto nella propria intestazione.

dll è una raccolta di funzioni riutilizzabili dove come .exe è un eseguibile che può chiamare queste funzioni


1
Il runtime .NET non ha nulla a che fare con .exe o .dll, sono file di codice macchina binario (se vengono prodotti in un linguaggio di programmazione che utilizza il runtime .NET, allora è coinvolto il runtime .NET, ma è già responsabilità del exe codice stesso, non caricatore del sistema operativo).
Ped7g

1

Un exe è un programma eseguibile mentre una DLL è un file che può essere caricato ed eseguito dai programmi in modo dinamico.


6
Qualcuno probabilmente ha pensato che la tua risposta non fosse abbastanza dettagliata.
JesperE

sì, le persone potrebbero non sapere cosa sia un programma eseguibile, e questa diventa essa stessa una domanda completamente nuova.
Mindless

1

● .exe e dll sono le versioni compilate del codice c #, chiamate anche come assembly.

● .exe è un file eseguibile autonomo, il che significa che può essere eseguito direttamente.

● .dll è un componente riutilizzabile che non può essere eseguito direttamente e richiede altri programmi per eseguirlo.


0

Differenza in DLL ed EXE:

1) DLL è un componente in-process, il che significa che viene eseguito nello stesso spazio di memoria del processo client. EXE è un componente Out-Process, il che significa che viene eseguito nel proprio spazio di memoria separato.

2) La DLL contiene funzioni e procedure che altri programmi possono utilizzare (promuove la riutilizzabilità) mentre EXE non può essere condiviso con altri programmi.

3) Le DLL non possono essere eseguite direttamente poiché sono progettate per essere caricate ed eseguite da altri programmi. EXE è un programma che viene eseguito direttamente.


-1

Si prega di commentare durante il downvoting.

Per chi cerca una risposta concisa,

  • Se un assembly viene compilato come libreria di classi e fornisce tipi da utilizzare per altri assembly, ha l'estensione ifle .dll (libreria di collegamento dinamico) e non può essere eseguito autonomamente.

  • Allo stesso modo, se un assembly viene compilato come un'applicazione, ha l'estensione di file .exe(eseguibile) e può essere eseguito autonomamente. Prima di .NET Core 3.0, le app della console venivano compilate in file .dll e dovevano essere eseguite dal comando dotnet run o da un eseguibile host. - Fonte


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.