Enfer de DLL
Dans le calculant , l'enfer de DLL de est dû aux complications qui surgissent en travaillant avec les bibliothèques de lien dynamique , (DLLs), dans les logiciels d'exploitation de de Microsoft Windows Bien que la limite soit Windows-spécifique, et la limite plus générale est l'enfer de dépendance de , l'enfer de DLL est employé souvent pour l'enfer de dépendance sur n'importe quelle plate-forme.
Il prend un certain nombre de formes, ci-dessous détaillé. Ce problème apparaît souvent dans une fenêtre alerte de Windows qui rapporte : " de ; Un dossier Required de DLL, xxxx, n'était pas found" ; ou " de ; Le point d'entrée de procédé xxxx n'a pas pu être situé dans xxxx.DLL" ; quand les utilisateurs essayent de courir une application, mais peut également se manifester plus tranquillement comme applications ne fonctionnant pas correctement.
Problèmes
Il y a un certain nombre de problèmes généralement produits avec le &ndash de DLLs ; particulièrement après de nombreuses applications ont été installés et désinstallés sur un système. Les difficultés incluent des conflits entre les versions de DLL, difficulté en obtenant DLLs required, et en ayant beaucoup de copies inutiles de DLL.versions incompatibles de
Le problème fondamental est que DLLs contiennent le code, et les différentes versions de la bibliothèque peuvent être incompatibles avec différentes versions des programmes qui s'attendent à le. Windows a été particulièrement vulnérable à ceci en raison de son emphase sur l'enchaînement dynamique des bibliothèques de C++ et objets du de VIEUX . Les classes de C++ exportent beaucoup de méthodes, et un changement simple à la classe (telle qu'une nouvelle méthode virtuelle) peut la rendre incompatible avec les programmes qui ont été établis contre la version antérieure. Le VIEUX a quelques règles très strictes pour empêcher ceci - des interfaces sont exigées pour être stables, des directeurs de mémoire ne sont pas partagées mais ce n'est pas assez car la sémantique d'une classe peut changer. Ce qui est une difficulté de bogue pour une application peut être un dispositif prévu d'une autre. Windows est vulnérable à ceci car COM classent la table, avant Windows Xp, a été partagée à travers tous les utilisateurs et processus. Seulement une COM objectent, dans un DLL/EXE pourrait être déclarée en tant qu'ayant COM spécifique ClassID. Le cas échéant programmer nécessaire pour créer un exemple de cette classe, il a obtenu celui qui ait été l'exécution centralement enregistrée de courant. En conséquence, une installation d'un programme qui installe une nouvelle version d'un objet commun peut par distraction casser les programmes d'autres personnes.
frapper du pied de DLL de de
Le problème le plus commun et le plus ennuyeux recouvrait un système de fonctionnement DLL avec une version incompatible. Un exemple célèbre de ceci était la bibliothèque de Un problème plus subtile se pose parce qu'une fois qu'un DLL est chargé, Windows emploiera la version courante, jusqu'à ce qu'application ne l'emploie pas. Ainsi même si le système DLL est correct, ou une application a une copie locale de fonctionnement, si une application précédente du a commencé par une version incompatible, la nouvelle application ne travaillera pas. Ceci peut se manifester l'un ou l'autre comme " ; une application ne fonctionne pas si une application différente est running" ; , ou plus mystérieusement comme " ; une application ne fonctionne pas si une application différente a été (mais ne pas avoir besoin de ne courir aucun plus long) " couru ; : si le L'enfer de DLL était un phénomène très commun sur pré-Windows 2000 versions des logiciels d'exploitation de Microsoft, la cause primaire étant que le du système d'exploitation n'a pas limité des installations de DLL. On s'est attendu à ce que des installateurs d'application soient de bons citoyens et vérifient l'information de version de DLL avant de recouvrir le système actuel DLLs. Des outils standard pour simplifier le déploiement d'application (qui implique toujours d'embarquer le DLLs du système d'exploitation dépendant) ont été fournis par Microsoft et d'autres fournisseurs d'outils de tiers. Microsoft a même exigé des fournisseurs d'application d'employer un installateur standard et de faire certifier leur programme d'installation pour travailler correctement, avant d'être accordé l'utilisation du logo de Microsoft. La bonne approche d'installateur de citoyen n'a pas atténué le problème, car l'élévation de la popularité de l'Internet a fourni plus d'occasions d'obtenir des applications non conformes. Une des solutions les plus simples à l'enfer de DLL dans une application est de lier statiquement toutes les bibliothèques. Ceci est pratiqué dans des applications de C/C++, où, au lieu de devoir s'inquiéter quelle version de MFC42.DLL est installée, compilent l'application à lier statiquement contre les mêmes bibliothèques. Ceci élimine le DLLs entièrement, et est viable pour les applications autonomes qui emploient seulement les bibliothèques - telles en tant que bibliothèque de classe de base de Microsoft de - cette offre une option statique. Une solution manuelle facile aux conflits plaçait les différentes versions du DLL de problème dans les chemises des applications, plutôt qu'au niveau système une chemise. Ceci fonctionne à condition que les applications ne soient pas courues simultanément. Cependant, empêché ceci avant Windows Xp, parce que les versions antérieures de Windows ont eu un enregistrement simple des objets de COM pour toutes les applications. La solution de XP est composant Side-by-Side de partageant (Page de MSDN), que les charges séparent des copies de DLLs pour chaque application qui les exige (et ainsi permet les applications qui exigent de DLLs contradictoire de fonctionner simultanément). Ceci élimine des conflits, mais élimine également un des avantages primaires de partager DLLs entre le &ndash d'applications ; réduction de l'utilisation de mémoire (avec les ordinateurs modernes qui ont l'abondance de l'espace disque et de la mémoire, ce peut être une approche raisonnable). D'autres avantages tels que des difficultés de bogue et des mises à jour de sécurité peuvent être affectés, et DLLs errant et peu sûr peut ne pas être mis à jour pendant des processus automatisés. .
ctl3d.dll en Windows 3.1 , celui de a été documenté par Microsoft, faisant apparaître de nombreuses variations dans le sauvage. Ceci a été résolu en le remplaçant par une nouvelle, non documentée bibliothèque de ctl3dv2.
pages de code partagées par de dans-mémoire de app a charge un corrompu ou bibliothèque incompatible, alors le app b est lancé et les utilisations qui la bibliothèque, qui la version restera dans la mémoire même après des sorties du app a (à condition que le app b fonctionne toujours), ainsi le app b pourrait pour fonctionner en raison du app a, quoique le app a ne fonctionne plus. Causes
L'incompatibilité de DLL était possible parce que Windows a manqué d'un certain nombre de dispositifs :
versioning standard imposé, appeler, et schéma d'endroit de système de fichiers pour DLLs ;
méthode standard imposée pour l'installation et l'élimination de logiciel (gestion de paquet de ) ;
le soutien bien fondé centralisé de la gestion de l'interface de binaire d'application de de DLL et les sauvegardes ont permis DLLs incompatible avec le mêmes nom de fichier et nombres de version internes à libérer ;
les outils de gestion excessivement simplifiés ont empêché l'identification de DLLs changé ou problématique par des utilisateurs et des administrateurs. Solutions
De diverses formes d'enfer de DLL ont été résolues ou atténuées au cours des années. Enchaînement statique
Frapper du pied de DLL
Le DLL recouvrant le problème (désigné sous le nom de frapper du pied de DLL de à l'intérieur de Microsoft) a été légèrement réduit avec la protection de dossier de Windows (PAM) qui a été présentée en Windows 2000 . Ceci empêche des applications non autorisées de recouvrir le système DLLs, à moins qu'elles emploient les api spécifiques de Windows qui permettent ceci. Il y a toujours un risque que les mises à jour de Microsoft (tel que Internet Explorer 7 ) sont incompatibles avec des applications existantes, mais les tiers applications ne peuvent pas frapper du pied sur des dossiers d'OS à moins qu'elles empaquettent des mises à jour de fenêtres avec leur installateur. DLLs contradictoire
Les solutions ici se composent avoir différentes copies du même DLLs pour chaque application, sur-disque et dans la mémoire. Contre-mesures
Il y a plusieurs contre-mesures connus pour éviter l'enfer de DLL, qui doivent être employés simultanément pour des résultats optimaux :
COM Enregistrement-libre : Le Windows Xp a présenté un nouveau mode de " appelé par enregistrement d'objet de COM ; " Enregistrement-libre de COM de ; ce n'était pas dû well-publicized au dégagement simultané de relatif à l'information à . Ce dispositif le rend possible aux applications qui doivent installer des objets de COM pour stocker toute l'information required d'enregistrement de COM dans l'annuaire de l'application, au lieu de dans l'enregistrement global, où à proprement parler si seulement une application simple emploiera jamais elle est toute qui est nécessaire. Ainsi, il fournit un mécanisme pour des versions multiples du même DLL pour être présent en même temps que nécessaire pour couvrir des applications multiples (Microsoft appelle ce " ; Assemblies" Side-by-side ; ). L'enfer de DLL peut être sensiblement évité using COM Enregistrement-libre, la seule limitation étant lui exige au moins le Windows Xp ou des versions postérieures et celle de Windows il ne doit pas être employé pour des serveurs ou au niveau système des composants de COM d'EXE tels que le MDAC , le MSXML , le DirectX ou le Internet Explorer .
Embarquant le du système d'exploitation avec un système de gestion capable de paquet qui peut dépister les dépendances de DLL, encourageant l'utilisation du directeur de paquet et l'installation manuelle discouraging de DLLs.
Ayant une autorité centrale pour distribuer la bibliothèque. Des changements à la bibliothèque peuvent être soumis à cette autorité ; ainsi, elle peut s'assurer que la compatibilité est préservée dans les branches développées. Si du logiciel plus ancien est incompatible avec la bibliothèque courante, l'autorité peut fournir une interface de compatibilité pour elle, ou empaqueter la vieille version comme paquet distinct.
Si les programmateurs de logiciel doivent adapter une bibliothèque, et si le dégagement de bibliothèque principale est peu susceptible d'incorporer les changements dont ils ont besoin, ils peuvent embarquer le DLL adapté aux besoins du client pour l'usage privé du programme (généralement en le plaçant dans l'annuaire privé du programme) ou statiquement lier le programme contre la bibliothèque adaptée aux besoins du client.
La conception de logiciel appropriée est primordiale. DLLs sont le meilleur pour des applications de modularisation et les composants de système et en tant que tiers bibliothèques ; leur utilisation n'est pas impérative dans tous les cas. Par exemple, si une application a besoin d'une bibliothèque qui ne sera pas employée n'importe où ailleurs, elle peut être liée statiquement, sans la pénalité de l'espace et avec un gain de vitesse. Enfer de DLL comme motivation pour .NET
En février de 2002, Microsoft a publiquement dévoilé le cadre du .NET qui a inclus une nouvelle version d'un système de déploiement de paquet, appelé des le . Ce cadre a également fourni l'appui pendant un temps d'exécution de langage commun (déplaçant essentiellement beaucoup de code de DLL à une classe basse de base). Ce concept, avec le dossier versioning, est souvent vu en tant qu'une des dernières constructions du système d'exploitation qui n'avaient pas établi le lien entre le OpenVMS et le Windows NT , qui ont partagé une architecture de systèmes de d'opération de terrain communal . Voir également
Enfer de dépendance de
Random links: Joseph Bernardin | George Darko | Gestion de ressource humaine | WFME | Infierno_del_DLL