87 votes

Qu'est-ce que dans une DLL et comment ça fonctionne? - 12 questions sur DLL

Je suis toujours référencement DLL dans mon code C#, mais ils sont restés un peu un mystère que je voudrais préciser. C'est une sorte de brain dump de questions au sujet de la DLL

Je comprends une DLL est une bibliothèque liée dynamiquement que je comprends, cela signifie qu'au moment de l'exécution d'un autre programme peut accéder à cette bibliothèque pour obtenir des "fonctionnalités". Toutefois,,,

Considérez les points suivants ASP.Net projet...

Web.dll Business.dll

Web.dll est l'extrémité avant de la fonctionnalité et les références business.dll pour les types et les méthodes.

1) À quel moment web.dll un lien dynamique vers business.dll? Vous remarquerez beaucoup dans Windows HDD raclée pour des petites tâches lors de l'utilisation de Word, etc et je pense que ce Mot va au large et dynamique de la liaison de la fonctionnalité de l'autre DLL?

1a) en Outre que les charges et les liens DLL - l'O/S ou de certains d'exécution framework comme l' .Net framework?

1b) Quel est le processus de "création de liens"? Les chèques faite qu'il y a de compatibilité? Le chargement dans la même mémoire? Ce que cette liaison ne signifie réellement?

2) Que s'exécute le code de la DLL? Est-il exécuté par le processeur, ou est-il une autre étape de la traduction ou de la compilation avant que le processeur va comprendre le code à l'intérieur de la DLL?

2a) Dans le cas d'une DLL construit à partir de C# .net qu'est-ce que cette exécution? L' .Net-cadre ou le système d'exploitation directement?

3) une DLL de dire que Linux travailler sur un système Windows (si une telle chose existe) ou sont-ils spécifiques au système d'exploitation?

4) Sont-ils spécifiques à un cadre particulier? Peut une DLL construit à l'aide de C# .Net être utilisé par une DLL construit avec Borland C++ (exemple seulement)?

4a) Si la réponse à la 4 est "non" alors, vraiment, quel est l'intérêt d'une DLL? Pourquoi ne pas les différents cadres utilisent leurs propres formats de fichiers liés? E. g. un .exe construire .Net sait qu'un type de fichier de .abc est quelque chose qu'il peut lien dans son code.

5) revenir à l'web.dll / business.dll exemple. Pour obtenir une classe de type de client que j'avais besoin de faire référence à business.dll à partir de web.dll. Cela doit signifier que business.dll contient un cahier des charges, de la sorte, de ce qu'un client de la classe est en réalité. Si j'avais compilé mon business.dll fichier en dire Delphi serait C# le comprendre et être en mesure de créer un client de la classe ou est-il une sorte d'en-tête info ou quelque chose qui dit "hey désolé vous ne pouvez servir de moi à partir d'un autre delphi dll".

5a) est de Même pour les méthodes.. puis-je écrire un CreateInvoice méthode dans une DLL, le compiler en C++ et ensuite de l'accès et de l'exécuter à partir de C#? Ce qui l'arrête ou me permet de faire ce.

6) Sur le thème de la DLL hijacking, sûrement le remplacement de la (mauvaise) DLL doit contenir la méthode exacte des signatures, des types comme celui qui s'est détourné. Je suppose que ce ne sera pas difficile à faire si vous pourriez trouver quelles méthodes, etc. sont disponibles dans la DLL originale.

6a) Un peu de répéter la question ici, mais c'est ce que dans mon programme C# est de décider si je peux accéder à une autre DLL? Si mon détourné DLL contenues exactement les mêmes méthodes et les types que l'original, mais il a été compilé dans un autre lanugage serait-il travailler?

Juste un peu plus de choses qui m'est venue à la dernière minute...

  • Qu'est-ce que DLL importation? et de l'enregistrement de dll?

C'est tout pour l'instant!

Merci.

75voto

Matti Virkkunen Points 31633

Ici, je allez, n'hésitez pas à signaler d'éventuelles erreurs. Je ne suis pas un expert avec Windows internals...

Tout d'abord, vous devez comprendre la différence entre les deux types très différents de Dll. Microsoft a décidé d'aller avec les mêmes extensions de fichier (.exe et .dll) avec les deux .NET (géré code) et le code natif, cependant le code managé Dll et Dll natives sont très différents à l'intérieur.

1) À quel moment web.dll un lien dynamique vers business.dll? Vous avis de beaucoup dans Windows HDD raclée pour des petites tâches lors de l' à l'aide de Word, etc et je pense que ce Mot se déclenche et dynamiquement le lien de la fonctionnalité de l'autre DLL?

1) Dans le cas d' .NET, les Dll sont généralement chargés à la demande lors de la première méthode en essayant d'accéder à n'importe quoi à partir de la DLL est exécutée. C'est pourquoi vous pouvez obtenir TypeNotFoundExceptions n'importe où dans votre code si une DLL ne peut pas être chargé. Quand quelque chose comme Word se met soudain à accéder au disque dur d'un lot, il est probable que la permutation de (l'obtention de données qui a été échangée sur le disque pour faire de la place dans la RAM)

1a) en Outre que les charges et les liens DLL - l'O/S ou certains runtime cadre comme les .Net framework?

1a) Dans le cas de la gestion de la Dll, le .NET framework est ce que les charges, JIT compile (compile le .NET bytecode en code natif) et les liens de la Dll. Dans le cas de Dll natives c'est un composant du système d'exploitation charges et les liens de la DLL (pas de compilation est nécessaire parce que la Dll natives déjà contenir du code natif).

1b) Quel est le processus de "création de liens"? Les chèques faite qu'il y a compatibilité? Le chargement dans la même mémoire? Ce n'reliant signifie réellement?

1b) la Liaison est quand références (par exemple, les appels de méthode) dans le code appelant à des symboles (par exemple, les méthodes) dans le DLL sont remplacées avec les adresses des choses dans la DLL. Cela est nécessaire parce que l'éventuelle adresses des choses dans la DLL ne peut pas être connu avant d'être chargé en mémoire.

2) Que s'exécute le code de la DLL? Est-il exécuté par le processeur, ou est-il une autre étape de la traduction ou de la compilation avant que le processeur va comprendre le code à l'intérieur de la DLL?

2) Sur Windows, .les fichiers exe et .les fichiers dll sont tout à fait identiques. Native .exe et .dll fichiers contiennent du code natif (de la même substance que le processeur exécute), donc il n'y a pas besoin de traduire. Géré .exe et .les fichiers dll contiennent .NET bytecode qui est d'abord JIT compilé (traduit en code natif).

2a) Dans le cas d'une DLL construit à partir de C# .net qu'est-ce que cette exécution? L' .Net-cadre ou le système d'exploitation directement?

2a), d'Après le code a été JIT compilé, c'est couru exactement de la même façon que n'importe quel code.

3) une DLL de dire que Linux travailler sur un système Windows (si une telle chose il existe) ou sont-ils spécifiques au système d'exploitation?

3) Géré Dll peut fonctionner que, aussi longtemps que les cadres sur les deux plates-formes sont à jour et que celui qui a écrit la DLL n'a pas délibérément en rupture de compatibilité en utilisant les appels natifs. Dll natives ne fonctionne que dans, que les formats sont différents (même si le code de l'ordinateur à l'intérieur est la même, si ils sont tous les deux de la même plate-forme de processeurs). Par ailleurs, sur Linux, "Dll" sont connus comme .(shared object) des fichiers.

4) Sont-ils spécifiques à un cadre particulier? Peut construit à l'aide d'une DLL C# .Net être utilisé par une DLL construit avec Borland C++ (exemple seulement)?

4) Géré Dll sont particuliers à la .NET framework, mais naturellement, ils fonctionnent avec n'importe quel langage compatible. Dll natives sont compatibles tant que tout le monde utilise les mêmes conventions (les conventions d'appel (comment les arguments d'une fonction sont passés dans la machine à niveau du code), symbole de nommage, etc)

5) revenir à l'web.dll / business.dll exemple. Pour obtenir une classe type de client, j'ai besoin de faire référence à business.dll à partir de web.dll. Cette faut dire que business.dll contient un cahier des charges d'une sorte de ce qu'est un client de classe est en réalité. Si j'avais compilé mon business.dll fichier en dire Delphi serait C# le comprendre et être en mesure de créer un la clientèle de la classe ou est-il une sorte d'en-tête info ou quelque chose qui dit "hey désolé vous ne pouvez servir de moi à partir d'un autre delphi dll".

5) Géré Dll contiennent une description complète de chaque classe, méthode, terrain, etc ils contiennent. Autant que je sache, Delphi ne prend pas en charge .NET, donc il serait de créer Dll natives, qui ne peut pas être utilisé .NET straightforwadly. Vous serez probablement en mesure d'appeler des fonctions avec PInvoke, mais les définitions de classe ne sera pas trouvé. Je n'utilise pas de Delphi, donc je ne sais pas comment il stocke des informations de type à la Dll. C++, par exemple, s'appuie sur l'en-tête (.h) les fichiers qui contiennent les déclarations de type et doit être distribué avec la DLL.

6) Sur le thème de la DLL hijacking, sûrement le remplacement de la (mauvaise) DLL doit contenir exactement les mêmes signatures de méthode, des types comme celui qui est a été détourné. Je suppose que ce ne sera pas difficile à faire si vous pourriez trouver quelles méthodes, etc. sont disponibles dans la DLL originale.

6) en Effet, il n'est pas difficile à faire si vous pouvez facilement changer la DLL. De signature de Code peut être utilisé pour éviter cela. Pour quelqu'un pour le remplacer signé DLL, ils auraient à connaître la clé de signature, dont elle a gardé le secret.

6a) Un peu de répéter la question ici, mais c'est ce que dans mon Programme C# est de décider si je peux accéder à une autre DLL? Si mon détourné DLL contenues exactement les mêmes méthodes et les types que l'original, mais il a été compilé dans un autre lanugage serait-il travailler?

6a), Il serait de travailler aussi longtemps que c'est une DLL géré, avec .NET de la langue.

  • Qu'est-ce que DLL importation? et de l'enregistrement de dll?

"DLL d'importation" peut signifier beaucoup de choses, généralement il désigne le référencement d'un fichier DLL et l'utilisation de choses en elle.

DLL d'inscription est quelque chose qui est fait sur Windows à l'échelle mondiale enregistrer les fichiers DLL comme les composants COM pour les rendre disponible à n'importe quel logiciel sur le système.

7voto

Beth Points 6644

Un .dll fichier contient le code compilé, vous pouvez l'utiliser dans votre application.

Parfois, l'outil utilisé pour compiler le .dll questions, parfois pas. Si vous pouvez faire référence à l' .dll dans votre projet, il n'est pas question que l'outil a été utilisé pour coder l' .dll exposés fonctions.

Le lien est établi au moment de l'exécution, à la différence statiquement les bibliothèques, tels que vos classes, qui sont des liens au moment de la compilation.

Vous pouvez considérer qu'un .dll comme une boîte noire qui offre quelque chose d'besoins de vos applications que vous ne voulez pas écrire vous-même. Oui, quelqu'un de la compréhension de l' .dll signature pourrait en créer une autre .fichier dll avec un code différent à l'intérieur et à l'application appelante ne pouvait pas savoir la différence.

HTH

6voto

edgman Points 104

1) À quel moment web.dll un lien dynamique vers business.dll? Vous avis de beaucoup dans Windows HDD raclée pour des petites tâches lors de l' à l'aide de Word, etc et je pense que ce Mot se déclenche et dynamiquement le lien de la fonctionnalité de l'autre DLL?

1) je pense que vous confondez le lien avec le chargement. Le lien, c'est quand tous les contrôles et les soldes sont testés pour être sûr que ce qui est demandé est disponible. Au moment du chargement, les pièces de la dll sont chargées dans la mémoire ou permutée vers le fichier d'échange. C'est la HD activité que vous voyez.

La liaison dynamique est différente de la liaison statique en ce que la liaison statique, tout le code objet est mis en la main .exe au moment de la liaison. Avec la liaison dynamique, le code objet est mis dans un fichier séparé (la dll) et il est chargé à un autre moment de la .exe.

Liaison dynamique peut être implicite (c'est à dire l'application des liens avec une importation lib) ou explicite (c'est à dire l'application utilise la fonction LoadLibrary(ex) pour charger la dll).

Dans l'implicite cas, /DELAYLOAD peut être utilisé pour retarder le chargement de la dll jusqu'à ce que l'application a réellement besoin. Sinon, au moins certaines parties sont chargés (mappé dans l'espace d'adressage de processus) dans le cadre du processus initilazation. La dll peut également demander ne jamais être déchargé tout le processus est actif.

COM utilise LoadLibrary pour charger les dll COM. Notez que, même dans l'implicite cas, le système est à l'aide de quelque chose de similaire à la fonction LoadLibrary pour charger la dll soit au démarrage ou lors de la première utilisation.

2) Que s'exécute le code de la DLL? Est-il exécuté par le processeur, ou est-il une autre étape de la traduction ou de la compilation avant que le processeur va comprendre le code à l'intérieur de la DLL?

2) Dll contiennent le code de l'objet, tout comme .exes. Le format du fichier dll est presque identique au format d'un fichier exe. J'ai entendu dire qu'il y a seulement un peu différente dans les en-têtes de les deux fichiers.

Dans le cas d'une DLL construit à partir de C# .net, le .Net framework est en cours d'exécution.

3) une DLL de dire que Linux travailler sur un système Windows (si une telle chose il existe) ou sont-ils spécifiques au système d'exploitation?

3) les Dll sont spécifique au système d'exploitation.

4) Sont-ils spécifiques à un cadre particulier? Peut construit à l'aide d'une DLL C# .Net être utilisé par une DLL construit avec Borland C++ (exemple seulement)?

4) Dll peuvent interagir avec d'autres cadres si une attention particulière est prise ou de certains de colle supplémentaire code est écrit.

Les dll sont très utiles lorsqu'une entreprise vend des produits multiples qui se chevauchent capacités. Par exemple, j'en ai toujours un raster i/o dll qui est utilisé par plus de 30 produits différents dans la société. Si vous avez plusieurs produits installés, une mise à jour de la dll pouvez mettre à niveau tous les produits à de nouveaux formats raster.

5) revenir à l'web.dll / business.dll exemple. Pour obtenir une classe type de client, j'ai besoin de faire référence à business.dll à partir de web.dll. Cette faut dire que business.dll contient un cahier des charges d'une sorte de ce qu'est un client de classe est en réalité. Si j'avais compilé mon business.dll fichier en dire Delphi serait C# le comprendre et être en mesure de créer un la clientèle de la classe ou est-il une sorte d'en-tête info ou quelque chose qui dit "hey désolé vous ne pouvez servir de moi à partir d'un autre delphi dll".

5) en Fonction de la plate-forme, les fonctions d'une dll sont présentés de diverses façons, par .h fichiers .fichiers tlb, ou d'autres moyens .net.

6) Sur le thème de la DLL hijacking, sûrement le remplacement de la (mauvaise) DLL doit contenir exactement les mêmes signatures de méthode, des types comme celui qui est a été détourné. Je suppose que ce ne sera pas difficile à faire si vous pourriez trouver quelles méthodes, etc. sont disponibles dans la DLL originale.

6) dumpbin exportations et dumbin /importations sont des outils intéressants pour une utilisation sur .exe et .dll

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X