Que sont exactement les fichiers DLL et comment fonctionnent-ils?

224

Comment fonctionnent exactement les fichiers DLL? Il semble y en avoir énormément, mais je ne sais pas ce qu'ils sont ni comment ils fonctionnent.

Alors, quel est le problème avec eux?

stalepretzel
la source
6
Étant donné que cela n'est étiqueté qu'avec Windows et que cette question a été écrite en 2008, il convient de mentionner que de nos jours, les DLL fonctionnent également sur Mac et Linux avec .NET Core.
Jim Aho

Réponses:

287

Qu'est-ce qu'une DLL?

Les bibliothèques de liens dynamiques (DLL) sont comme des EXE, mais elles ne sont pas directement exécutables. Ils sont similaires aux fichiers .so sous Linux / Unix. C'est-à-dire que les DLL sont l'implémentation par MS de bibliothèques partagées.

Les DLL ressemblent tellement à un EXE que le format de fichier lui-même est le même. Les fichiers EXE et DLL sont basés sur le format de fichier Portable Executable (PE). Les DLL peuvent également contenir des composants COM et des bibliothèques .NET.

Que contient une DLL?

Une DLL contient des fonctions, des classes, des variables, des interfaces utilisateur et des ressources (telles que des icônes, des images, des fichiers, ...) qu'un EXE ou une autre DLL utilise.

Types de bibliothèques:

Sur pratiquement tous les systèmes d'exploitation, il existe 2 types de bibliothèques. Bibliothèques statiques et bibliothèques dynamiques. Dans Windows, les extensions de fichiers sont les suivantes: bibliothèques statiques (.lib) et bibliothèques dynamiques (.dll). La principale différence est que les bibliothèques statiques sont liées à l'exécutable au moment de la compilation; tandis que les bibliothèques liées dynamiques ne sont pas liées avant l'exécution.

Plus d'informations sur les bibliothèques statiques et dynamiques:

Vous ne voyez normalement pas de bibliothèques statiques sur votre ordinateur, car une bibliothèque statique est intégrée directement à l'intérieur d'un module (EXE ou DLL). Une bibliothèque dynamique est un fichier autonome.

Une DLL peut être modifiée à tout moment et n'est chargée qu'au moment de l'exécution lorsqu'un EXE charge explicitement la DLL. Une bibliothèque statique ne peut pas être modifiée une fois qu'elle est compilée dans l'EXE. Une DLL peut être mise à jour individuellement sans mettre à jour l'EXE lui-même.

Chargement d'une DLL:

Un programme charge une DLL au démarrage, via l'API Win32 LoadLibrary ou lorsqu'il s'agit d'une dépendance d'une autre DLL. Un programme utilise GetProcAddress pour charger une fonction ou LoadResource pour charger une ressource.

Lectures complémentaires:

Veuillez consulter MSDN ou Wikipedia pour plus de lecture. Aussi les sources de cette réponse.

Brian R. Bondy
la source
5
Devrait probablement mentionner la bibliothèque d'importation quelque part. OK, je m'en vais maintenant. :)
Adam Mitz
2
Supprimé ceux qui semblent être résolus. Comment obtenir des points pour cela? <g>
Adam Mitz
36

Qu'est-ce qu'une DLL?

Les fichiers DLL sont des fichiers binaires qui peuvent contenir du code exécutable et des ressources comme des images, etc. Contrairement aux applications, ceux-ci ne peuvent pas être exécutés directement, mais une application les chargera au fur et à mesure de leur utilisation (ou en une seule fois au démarrage).

Sont-ils importants?

La plupart des applications chargeront les fichiers DLL dont ils ont besoin au démarrage. Si aucun de ces éléments n'est trouvé, le système ne pourra pas du tout démarrer le processus.

Les fichiers DLL peuvent nécessiter d'autres fichiers DLL

De la même manière qu'une application nécessite un fichier DLL, un fichier DLL peut dépendre d'autres fichiers DLL lui-même. Si l'un de ces fichiers DLL dans la chaîne de dépendance n'est pas trouvé, l'application ne se charge pas. Ceci est facilement débogué à l'aide de n'importe quel outil de marche de dépendance, comme Dependency Walker .

Il y en a tellement dans les dossiers système

La plupart des fonctionnalités du système sont exposées à un programme utilisateur sous forme de fichiers DLL car elles constituent une forme standard de partage de code / ressources. Chaque fonctionnalité est conservée séparément dans différents fichiers DLL afin que seuls les fichiers DLL requis soient chargés et réduisent ainsi les contraintes de mémoire sur le système.

Les applications installées utilisent également des fichiers DLL

Les fichiers DLL deviennent également une forme de séparation physique des fonctionnalités, comme expliqué ci-dessus. Les bonnes applications essaient également de ne pas charger les fichiers DLL jusqu'à ce qu'ils soient absolument nécessaires, ce qui réduit les besoins en mémoire. Cela entraîne également la livraison des applications avec de nombreux fichiers DLL.

DLL Hell

Cependant, parfois, les mises à niveau du système interrompent souvent d'autres programmes lorsqu'il existe une incompatibilité de version entre les fichiers DLL partagés et le programme qui les requiert. Les points de contrôle du système et le cache DLL, etc. ont été les initiatives de M $ pour résoudre ce problème. La plate-forme .NET n'est peut-être pas du tout confrontée à ce problème.

Comment savoir ce qu'il y a dans un fichier DLL?

Vous devez utiliser un outil externe comme DUMPBIN ou Dependency Walker qui montrera non seulement quelles fonctions visibles publiquement (connues sous le nom d'exportations) sont contenues dans les fichiers DLL et également quels autres fichiers DLL dont il a besoin et quelles exportations de ces fichiers DLL ce fichier DLL dépend.

Comment les créons-nous / les utilisons-nous?

Reportez-vous à la documentation de programmation de votre fournisseur. Pour C ++, reportez-vous à LoadLibrary dans MSDN.

vie informatique
la source
2
Veuillez compléter cette phrase ( "The .NET platform might not face this issue at all.") avec un pourquoi. Merci.
Jogi
1
@RehanKhan À partir de .NET Framework v2.0, le runtime ne charge que les assemblys compilés avec une version .NET <= le runtime actuellement chargé + .NET met également en cache les tentatives infructueuses de chargement des assemblys + si un appel précédent a déjà localisé un assembly, le runtime CL utilisera l'assembly déjà chargé. Dans l'ensemble, je pense qu'il vaut mieux dire qu'ils ont résolu le problème en appliquant des restrictions très lourdes sur les DLL que l'exécution d'un programme chargera (avant qu'il n'abandonne et demande votre aide).
Vladislav Martin
14

Disons que vous créez un exécutable qui utilise certaines fonctions trouvées dans une bibliothèque.

Si la bibliothèque que vous utilisez est statique , l'éditeur de liens copiera le code objet de ces fonctions directement à partir de la bibliothèque et les insérera dans l'exécutable.

Maintenant, si cet exécutable est exécuté, il a tout ce dont il a besoin, le chargeur exécutable le charge simplement en mémoire et l'exécute.

Si la bibliothèque est dynamique, l'éditeur de liens n'insérera pas de code objet mais insérera plutôt un stub qui indique essentiellement que cette fonction se trouve dans cette DLL à cet emplacement.

Maintenant, si cet exécutable est exécuté, des bits de l'exécutable sont manquants (c'est-à-dire les talons) donc le chargeur passe par l'exécutable en réparant les talons manquants. Ce n'est qu'après la résolution de tous les stubs que l'exécutable pourra s'exécuter.

Pour voir cela en action, supprimez ou renommez la DLL et regardez comment le chargeur signalera une erreur DLL manquante lorsque vous essayez d'exécuter l'exécutable.

D'où le nom Dynamic Link Library , certaines parties du processus de liaison sont effectuées dynamiquement au moment de l'exécution par le chargeur exécutable.

Une dernière remarque, si vous ne liez pas à la DLL, aucun lien ne sera inséré par l'éditeur de liens, mais Windows fournit toujours l' API GetProcAddress qui vous permet de charger et d'exécuter le point d'entrée de la fonction DLL bien après le démarrage de l'exécutable.

jussij
la source
12

Les DLL (bibliothèques de liens dynamiques) et les SL (bibliothèques partagées, équivalentes sous UNIX) ne sont que des bibliothèques de code exécutable qui peuvent être liées dynamiquement en un exécutable au moment du chargement.

Les bibliothèques statiques sont insérées dans un exécutable au moment de la compilation et sont fixées à partir de ce point. Ils augmentent la taille de l'exécutable et ne peuvent pas être partagés.

Les bibliothèques dynamiques présentent les avantages suivants:

1 / Ils sont chargés au moment de l'exécution plutôt qu'au moment de la compilation afin qu'ils puissent être mis à jour indépendamment de l'exécutable (toutes ces fantastiques fenêtres et boîtes de dialogue que vous voyez dans Windows proviennent de DLL afin que l'apparence de votre application puisse changer sans vous avoir à le réécrire).

2 / Parce qu'ils sont indépendants, le code peut être partagé entre plusieurs exécutables - cela économise de la mémoire car, si vous exécutez 100 applications avec une seule DLL, il ne peut y avoir qu'une seule copie de la DLL en mémoire.

Leur principal inconvénient est l'avantage n ° 1 - le fait que les DLL changent indépendamment de votre application peut entraîner le blocage de votre application ou un comportement bizarre. La gestion des versions de DLL a tendance à ne pas être très bien gérée sous Windows, ce qui conduit au "Hell Hell".

paxdiablo
la source
11

Les fichiers DLL contiennent une table d'exportation qui est une liste de symboles qui peuvent être recherchés par le programme appelant. Les symboles sont généralement des fonctions avec la convention d'appel C ( __stcall ). La table d'exportation contient également l'adresse de la fonction.

Avec ces informations, le programme appelant peut ensuite appeler les fonctions dans la DLL même s'il n'avait pas accès à la DLL au moment de la compilation.

L'introduction des bibliothèques de liens dynamiques contient des informations supplémentaires.

Adam Pierce
la source
6

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

Une DLL est une bibliothèque qui contient du code et des données qui peuvent être utilisées par plusieurs programmes en même temps. Par exemple, dans les systèmes d'exploitation Windows, la DLL Comdlg32 exécute des fonctions liées aux boîtes de dialogue courantes. Par conséquent, chaque programme peut utiliser les fonctionnalités contenues dans cette DLL pour implémenter une boîte de dialogue Ouvrir. Cela permet de promouvoir la réutilisation du code et l'utilisation efficace de la mémoire.

En utilisant une DLL, un programme peut être modularisé en composants séparés. Par exemple, un programme de comptabilité peut être vendu par module. Chaque module peut être chargé dans le programme principal au moment de l'exécution si ce module est installé. Étant donné que les modules sont séparés, le temps de chargement du programme est plus rapide et un module n'est chargé que lorsque cette fonctionnalité est demandée.

De plus, les mises à jour sont plus faciles à appliquer à chaque module sans affecter les autres parties du programme. Par exemple, vous pouvez avoir un programme de paie et les taux d'imposition changent chaque année. Lorsque ces modifications sont isolées dans une DLL, vous pouvez appliquer une mise à jour sans avoir à générer ou réinstaller l'intégralité du programme.

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

Jorge Ferreira
la source
2

DLL est une extension de fichier connue sous le nom de format de fichier «bibliothèque de liens dynamiques» utilisée pour contenir plusieurs codes et procédures pour les programmes Windows. Software & Games fonctionne sur la base des fichiers DLL; Les fichiers DLL ont été créés afin que plusieurs applications puissent utiliser leurs informations en même temps.

SI vous souhaitez obtenir plus d'informations sur les fichiers DLL ou face à une erreur, lisez le post suivant. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

Akshya Nagar
la source
1

Les DLL (Dynamic Link Libraries) contiennent des ressources utilisées par une ou plusieurs applications ou services. Ils peuvent contenir des classes, des icônes, des chaînes, des objets, des interfaces et à peu près tout ce qu'un développeur aurait besoin de stocker, sauf une interface utilisateur.

tsilb
la source
3
Ils peuvent en fait stocker une interface utilisateur et plusieurs programmes le font. Par exemple, des composants logiciels enfichables.
Brian R. Bondy
1

Selon Microsoft

(DLL) Les bibliothèques de liens dynamiques sont des fichiers qui contiennent des données, du code ou des ressources nécessaires à l'exécution des applications. Ce sont des fichiers créés par l'écosystème Windows et qui peuvent être partagés entre deux ou plusieurs applications.

Lorsqu'un programme ou un logiciel s'exécute sur Windows, une grande partie du fonctionnement de l'application dépend des fichiers DLL du programme. Par exemple, si une application particulière avait plusieurs modules, la façon dont chaque module interagit entre eux est déterminée par les fichiers DLL Windows.

Si vous souhaitez une explication détaillée, consultez ces ressources utiles

Quels sont les fichiers DLL , à propos des fichiers DLL

constructeurs de code
la source