Cosa sono esattamente i file DLL e come funzionano?


224

Come funzionano esattamente i file DLL? Sembra che ce ne siano moltissimi, ma non so cosa siano o come funzionano.

Quindi, qual è il problema con loro?


6
Poiché questo è solo taggato con Windows e questa domanda è stata scritta nel 2008, vale la pena ricordare che oggigiorno la dll funziona anche su Mac e Linux con .NET Core.
Jim Aho,

Risposte:


287

Che cos'è una DLL?

Le librerie Dynamic Link Libraries (DLL) sono come EXE ma non sono eseguibili direttamente. Sono simili ai file .so in Linux / Unix. Vale a dire, le DLL sono l'implementazione MS di librerie condivise.

Le DLL sono così simili a un EXE che il formato del file stesso è lo stesso. Sia EXE che DLL si basano sul formato di file Portable Executable (PE). Le DLL possono contenere anche componenti COM e librerie .NET.

Cosa contiene una DLL?

Una DLL contiene funzioni, classi, variabili, UI e risorse (come icone, immagini, file, ...) utilizzate da una EXE o da altre DLL.

Tipi di biblioteche:

Su quasi tutti i sistemi operativi, ci sono 2 tipi di librerie. Librerie statiche e librerie dinamiche. In Windows le estensioni dei file sono le seguenti: Librerie statiche (.lib) e librerie dinamiche (.dll). La differenza principale è che le librerie statiche sono collegate all'eseguibile in fase di compilazione; mentre le librerie collegate dinamiche non sono collegate fino al runtime.

Altro su librerie statiche e dinamiche:

Normalmente non vedi le librerie statiche sul tuo computer, perché una libreria statica è incorporata direttamente all'interno di un modulo (EXE o DLL). Una libreria dinamica è un file autonomo.

Una DLL può essere modificata in qualsiasi momento e viene caricata in fase di esecuzione solo quando un EXE carica esplicitamente la DLL. Una libreria statica non può essere modificata una volta compilata all'interno di EXE. Una DLL può essere aggiornata singolarmente senza aggiornare il file EXE stesso.

Caricamento di una DLL:

Un programma carica una DLL all'avvio, tramite LoadLibrary API Win32 o quando è una dipendenza di un'altra DLL. Un programma utilizza GetProcAddress per caricare una funzione o LoadResource per caricare una risorsa.

Ulteriori letture:

Per ulteriori informazioni, consultare MSDN o Wikipedia . Anche le fonti di questa risposta.


5
Dovrebbe probabilmente menzionare la lib di importazione da qualche parte. OK, ora vado via. :)
Adam Mitz,

2
Rimossi quelli che sembrano essere indirizzati. Come posso ottenere punti per questo? <g>
Adam Mitz,

36

Che cos'è una DLL?

I file DLL sono file binari che possono contenere codice eseguibile e risorse come immagini, ecc. A differenza delle applicazioni, queste non possono essere eseguite direttamente, ma un'applicazione le caricherà come e quando sono necessarie (o tutte in una volta all'avvio).

Sono importanti?

La maggior parte delle applicazioni caricherà i file DLL necessari all'avvio. Se qualcuno di questi non viene trovato, il sistema non sarà in grado di avviare il processo.

I file DLL potrebbero richiedere altri file DLL

Allo stesso modo in cui un'applicazione richiede un file DLL, un file DLL potrebbe dipendere da altri file DLL stessi. Se non viene trovato uno di questi file DLL nella catena di dipendenza, l'applicazione non verrà caricata. È possibile eseguire facilmente il debug utilizzando qualsiasi strumento Walker di dipendenza, come Dependency Walker .

Ce ne sono così tanti nelle cartelle di sistema

La maggior parte delle funzionalità del sistema è esposta a un programma utente sotto forma di file DLL in quanto forma standard di condivisione di codice / risorse. Ogni funzionalità viene mantenuta separatamente in diversi file DLL in modo che vengano caricati solo i file DLL richiesti e quindi riduca i vincoli di memoria sul sistema.

Le applicazioni installate usano anche file DLL

I file DLL diventano anche una forma di separazione fisica delle funzionalità come spiegato sopra. Le buone applicazioni provano anche a non caricare i file DLL fino a quando non sono assolutamente necessari, il che riduce i requisiti di memoria. Anche questo fa sì che le applicazioni vengano fornite con molti file DLL.

Inferno DLL

Tuttavia, a volte gli aggiornamenti di sistema interrompono spesso altri programmi quando esiste una mancata corrispondenza della versione tra i file DLL condivisi e il programma che li richiede. Checkpoint di sistema, cache DLL, ecc. Sono state le iniziative di M $ per risolvere questo problema. La piattaforma .NET potrebbe non affrontare affatto questo problema.

Come facciamo a sapere cosa c'è dentro un file DLL?

Devi usare uno strumento esterno come DUMPBIN o Dependency Walker che mostrerà non solo quali funzioni visibili pubblicamente (note come esportazioni) sono contenute nei file DLL e anche quali altri file DLL sono necessari e quali esportazioni da questi file DLL questo file DLL dipende da.

Come li creiamo / li usiamo?

Consultare la documentazione di programmazione del proprio fornitore. Per C ++, fare riferimento a LoadLibrary in MSDN.


2
Per favore, completa questa frase ( "The .NET platform might not face this issue at all.") con un perché. Grazie.
Jogi,

1
@RehanKhan A partire da .NET Framework v2.0, il runtime caricherà solo gli assembly compilati con una versione .NET <= runtime attualmente caricato + .NET memorizza anche nella cache i tentativi falliti di caricare gli assembly + se una chiamata precedente già individuava un assembly, il runtime CL utilizzerà l'assembly già caricato. Tutto sommato, penso che sia meglio dire che hanno risolto il problema applicando restrizioni molto pesanti su quali DLL verranno caricate durante l'esecuzione di un programma (prima che si arrenda e chieda il tuo aiuto).
Vladislav Martin,

14

Supponiamo che tu stia creando un eseguibile che utilizza alcune funzioni presenti in una libreria.

Se la libreria in uso è statica , il linker copierà il codice oggetto per queste funzioni direttamente dalla libreria e le inserirà nell'eseguibile.

Ora, se questo eseguibile viene eseguito, ha tutto ciò di cui ha bisogno, quindi il caricatore eseguibile lo carica e lo esegue.

Se la libreria è dinamica, il linker non inserirà il codice oggetto ma piuttosto inserirà uno stub che sostanzialmente dice che questa funzione si trova in questa DLL in questa posizione.

Ora, se questo eseguibile viene eseguito, i bit dell'eseguibile mancano (cioè gli stub), quindi il caricatore passa attraverso l'eseguibile fissando gli stub mancanti. Solo dopo che tutti gli stub saranno stati risolti, sarà possibile eseguire l'eseguibile.

Per vederlo in azione, eliminare o rinominare la DLL e osservare come il caricatore segnalerà un errore DLL mancante quando si tenta di eseguire l'eseguibile.

Da qui il nome Dynamic Link Library , parti del processo di collegamento vengono eseguite dinamicamente in fase di esecuzione dal caricatore eseguibile.

Un'ultima nota, se non si collega alla DLL, il linker non inserirà stub, ma Windows fornisce comunque l' API GetProcAddress che consente di caricare un punto di ingresso della funzione DLL molto tempo dopo l'avvio dell'eseguibile.


12

DLL (librerie a collegamento dinamico) e SL (librerie condivise, equivalenti a UNIX) sono solo librerie di codice eseguibile che possono essere collegate dinamicamente in un eseguibile al momento del caricamento.

Le librerie statiche vengono inserite in un eseguibile in fase di compilazione e vengono riparate da quel punto. Aumentano le dimensioni dell'eseguibile e non possono essere condivise.

Le librerie dinamiche presentano i seguenti vantaggi:

1 / Vengono caricati in fase di esecuzione anziché in fase di compilazione in modo da poter essere aggiornati indipendentemente dall'eseguibile (tutte le finestre e le finestre di dialogo di fantasia che vedi in Windows provengono da DLL, quindi l'aspetto della tua applicazione può cambiare senza di te doverlo riscrivere).

2 / Poiché sono indipendenti, il codice può essere condiviso tra più eseguibili: questo consente di risparmiare memoria poiché, se si eseguono 100 app con una singola DLL, potrebbe esserci solo una copia della DLL in memoria.

Il loro principale svantaggio è il vantaggio n. 1: avere DLL che cambiano indipendentemente dall'applicazione potrebbe causare il blocco dell'applicazione o iniziare a comportarsi in modo bizzarro. Il controllo delle versioni delle DLL tende a non essere gestito molto bene in Windows e questo porta al cosiddetto "inferno DLL".


11

I file DLL contengono una tabella di esportazione che è un elenco di simboli che possono essere cercati dal programma chiamante. I simboli sono in genere funzioni con la convenzione di chiamata C ( __stcall ). La tabella di esportazione contiene anche l'indirizzo della funzione.

Con queste informazioni, il programma chiamante può quindi chiamare le funzioni all'interno della DLL anche se non aveva accesso alla DLL al momento della compilazione.

L'introduzione di Dynamic Link Libraries ha qualche informazione in più.


6

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

Una DLL è una libreria che contiene codice e dati che possono essere utilizzati da più di un programma contemporaneamente. Ad esempio, nei sistemi operativi Windows, la DLL Comdlg32 esegue funzioni comuni relative alla finestra di dialogo. Pertanto, ogni programma può utilizzare la funzionalità contenuta in questa DLL per implementare una finestra di dialogo Apri. Questo aiuta a promuovere il riutilizzo del codice e l'uso efficiente della memoria.

Usando una DLL, un programma può essere modulare in componenti separati. Ad esempio, un programma di contabilità può essere venduto per modulo. Ogni modulo può essere caricato nel programma principale in fase di esecuzione se quel modulo è installato. Poiché i moduli sono separati, il tempo di caricamento del programma è più veloce e un modulo viene caricato solo quando viene richiesta quella funzionalità.

Inoltre, gli aggiornamenti sono più facili da applicare a ciascun modulo senza influire su altre parti del programma. Ad esempio, potresti avere un programma sui salari e le aliquote fiscali cambiano ogni anno. Quando queste modifiche sono isolate in una DLL, è possibile applicare un aggiornamento senza dover compilare o installare nuovamente l'intero programma.

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


2

DLL è un formato di file noto come "libreria a collegamento dinamico" utilizzato per contenere più codici e procedure per i programmi Windows. Software e giochi vengono eseguiti sulla base di file DLL; I file DLL sono stati creati in modo che più applicazioni possano utilizzare le loro informazioni contemporaneamente.

Se si desidera ottenere ulteriori informazioni sui file DLL o di fronte a qualsiasi errore, leggere il seguente post. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

Le DLL (Dynamic Link Libraries) contengono risorse utilizzate da una o più applicazioni o servizi. Possono contenere classi, icone, stringhe, oggetti, interfacce e praticamente tutto ciò che uno sviluppatore dovrebbe archiviare tranne un'interfaccia utente.


3
Possono effettivamente memorizzare un'interfaccia utente e diversi programmi lo fanno. Ad esempio snap-in.
Brian R. Bondy,

1

Secondo Microsoft

(DLL) Le librerie a collegamento dinamico sono file che contengono dati, codice o risorse necessarie per l'esecuzione delle applicazioni. Si tratta di file creati dall'ecosistema di Windows e che possono essere condivisi tra due o più applicazioni.

Quando un programma o un software viene eseguito su Windows, gran parte del funzionamento dell'applicazione dipende dai file DLL del programma. Ad esempio, se una particolare applicazione aveva diversi moduli, il modo in cui ciascun modulo interagisce tra loro è determinato dai file DLL di Windows.

Se vuoi una spiegazione dettagliata, controlla queste utili risorse

Cosa sono i file dll , Informazioni sui file dll

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.