Qu'est-ce que dans une DLL et comment ça fonctionne?
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 concernant les Dll.
Je comprends une DLL est une bibliothèque liée dynamiquement ce qui signifie qu'un autre programme peut accéder à cette bibliothèque au moment de l'exécution pour obtenir la "fonctionnalité". Cependant, considérer les points suivants ASP.NET projet avec Web.dll
et 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).
-
À quel point
Web.dll
d'un lien dynamique versBusiness.dll
? Vous remarquerez beaucoup dans Windows HDD raclée pour des petites tâches lors de l'utilisation de Word (etc.) et je crois que ce Mot est hors tension et dynamiquement de liaison dans les fonctionnalités des autres Dll?1a. En outre, ce que les charges et les liens DLL - le système d'exploitation ou à certains moment de l'exécution framework comme l' .NET framework?
1b. Quel est le processus de "création de liens"? Sont les contrôles de compatibilité faite? Le chargement dans la même mémoire? Ce que cette liaison ne signifie réellement?
-
Ce qui s'est réellement 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 en C# .NET, ce qui est en cours d'exécution: le .NET-cadre ou le système d'exploitation directement?
-
Un DLL à partir de Linux travailler sur un système Windows (si une telle chose existe), ou sont-ils spécifiques au système d'exploitation?
-
Sont des Dll spécifiques à un cadre particulier? Peut une DLL construit à l'aide de C# .NET être utilisé par une DLL construit avec, par exemple, Borland C++?
4a. Si la réponse à la 4 est "non", alors quel est le point d'une DLL? Pourquoi ne pas les différents cadres utilisent leurs propres formats de fichiers liés? Par exemple: un .exe construit en .NET sait qu'un type de fichier de .abc est quelque chose qu'il peut lien dans son code.
-
De revenir à la
Web.dll
/Business.dll
exemple - pour obtenir une classe de type de client, j'ai besoin de faire référence àBusiness.dll
deWeb.dll
. Cela doit signifier queBusiness.dll
contient une sorte de spécification de ce qu'est un client de classe est en réalité. Si j'avais compilé monBusiness.dll
fichier, disons, Delphi: serait-C# le comprendre et être en mesure de créer une classe de clients, 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. De même pour les méthodes; puis-je écrire un
CreateInvoice()
méthode dans une DLL, le compiler en C++, puis de l'accès et de l'exécuter à partir de C#? Ce qui l'arrête ou me permet de faire cela? -
Sur le sujet de la DLL hijacking, sûrement le remplacement de la (mauvaise) DLL doit contenir la méthode exacte des signatures et des types comme celui qui s'est détourné. Je suppose que ce ne serait pas difficile à faire si vous pouviez trouver quelles méthodes ont été mises à disposition dans la DLL.
6a. Ce qui 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 une autre langue, serait-il travailler?
Ce qui est de la DLL de l'importation et de l'enregistrement de DLL?
- Cette question est peut-être tout à fait demander pour plus de réponse dans l'histoire.
- Je pense que cette question mérite une plus grande attention. Je ne vais pas voter pour fermer parce que je pense qu'il a du potentiel.
- Il doit avoir été 12 Questions distinctes.
- C'est un super question, mais j'ai vraiment d'accord avec @Chaos et @Matti. Cette question mérite plus d'attention et pourrait/devrait être divisé en un certain nombre de questions différentes.
- C'était un peu un brain dump quand je l'ai écrit + je voulais centraliser les connaissances dans un domaine 🙂
- Devrait être une communauté wiki maintenant.
Vous devez vous connecter pour publier un commentaire.
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) 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) 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) 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) 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), 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) Géré Dll peuvent aussi travailler-est, 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 .donc (shared object) des fichiers.
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) 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) 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), Il serait de travailler aussi longtemps que c'est une DLL géré, avec .NET de la langue.
"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.
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 penser à 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 connaître la différence.
HTH
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.
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 fait en a 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) 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) Dll sont spécifiques de la plateforme.
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.
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) 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 façons .net.
6) dumpbin exportations et dumbin /importations sont des outils intéressants pour une utilisation sur .exe et .dll