2008-12-18 14 views
23

Comment puis-je obtenir le chemin d'accès (physique) d'une DLL qui est (peut-être) enregistrée dans GAC? Cette DLL est un contrôle qui peut être hébergé dans autre chose qu'une application .Net (y compris les IDE autres que VS ...). Lorsque j'utilise System.Reflection.Assembly.GetExecutingAssembly(). Location, il donne le chemin du dossier GAC dans winnt \ system32 - ou en mode Design dans VS donne le chemin vers l'EDI VS.(physique) Chemin (installé) de la DLL installée sur le GAC

Je dois obtenir le chemin d'installation physique de la DLL - ou le dossier bin/debug ou (release) pour VS.

La raison est qu'il ya un fichier XML que je dois obtenir à dans ce dossier, avec option de configuration qui sont utilisés aussi bien en mode conception et à l'exécution.

Ou comment est-il préférable de gérer ce scénario? J'ai un emplacement réseau douteux que j'utilise pour le mode design pour le moment ... (Ne pensez pas que le dossier ApplicationData va le couper (mais que la version .Net a été installée car elle est installée via ClickOnce et peut utiliser les données de Clickonce dossier))

Répondre

22

Si quelque chose est mis dans le GAC, il se fait copié dans un endroit sous% windir% \ assembly, comme

C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll 

Je suppose que vous êtes voir quelque chose comme ça quand vous vérifiez l'emplacement de l'assembly en question quand il est installé dans le GAC. C'est en fait correct. (Dans .NET 1.1, il y avait une "Codebase" listée lorsque vous regardiez les propriétés d'un assembly GAC, mais uniquement pour vous montrer où se trouvait le fichier original lorsque vous avez lancé gacutil - il n'indiquait pas réellement ce qui serait chargé.) Vous pouvez lire more about that here.

Bref, vous ne pourrez peut-être pas faire ce que vous voulez faire. Au lieu de regarder par rapport à un assembly en cours de chargement (Assembly.GetExecutingAssembly()), vous pouvez changer le comportement par rapport à l'assembly d'application principal (Assembly.GetEntryAssembly()) ou placer le fichier dans un emplacement connu, éventuellement basé sur une variable d'environnement ça se passe.

+0

J'ai, depuis le début, voulu opter pour un dossier ApplicationData standard, selon votre 2e suggestion - mais il faudra que ce soit dans la prochaine version, trop tard pour le faire maintenant. Je l'ai essayé plusieurs chemins psosibles pour l'instant ... – kpollock

+1

+1 c'est un super lien –

3

Avez-vous la possibilité d'incorporer une ressource à cette DLL? De cette façon, peu importe où la DLL se trouve sur le disque, car le fichier XML le suivra. Vous pouvez alors faire quelque chose comme ceci:

Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml"); 
XmlDocument d = new XmlDocument(); 
using (StreamReader r = new StreamReader(s)) 
{ 
    d.LoadXml(r.ReadToEnd()); 
} 
+0

C'est ce que nous faisions, mais le fichier est un fichier de paramètres de configuration et cela signifiait que nous devions faire plusieurs builds ciblant différents environnements. L'idée est de faire une construction et que le fichier de configuration contrôle les paramètres dépendants de l'environnement. – kpollock

2

Si vous êtes à la recherche de l'emplacement physique où votre GACed DLL est enregistré dans le système de fichiers, essayez ceci: Démarrer -> Exécuter -> c: \ windows \ assembly \ gac Si vous ne trouvez pas votre dossier DLL lié là-bas, vous pouvez faire un dossier "Up" dans Windows Explorer pour afficher tout dans c: \ windows \ assembly en tant que structures de dossiers. Vous pouvez alors chercher votre DLL sous GAC_MSIL ou tout autre dossier là ....

Cheers, Sri

+0

désolé si je n'étais pas clair, mais je voulais dire dans le code! Ceci est une très vieille question et à peu près répondu par la réponse cochée ci-dessus. – kpollock

3

Après l'assemblage est ombre copié dans le cache de l'Assemblée mondiale, je ne pense pas qu'il y ait des métadonnées pour retracer l'emplacement des assemblages sources. Qu'essayez-vous d'accomplir en déployant dans GAC?

Si c'est juste pour le CLR à des fins de résolution, alors il existe un moyen alternatif qui résout votre problème.

Ne gac installer le dll, ajoutez plutôt la clé suivante dans le Registre, (cet emplacement de registre est recherché par CLR en essayant de résoudre les assemblées)

32 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo 

64 bit OS : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\foo 

Pour la clé foo (Utilisez votre nom préféré au lieu de foo), vous verrez un nom de clé "par défaut". Double-cliquez dessus et définissez la valeur à l'endroit où votre assembly existe. (chemin absolu est préféré)

Maintenant à partir de Visual Studio, votre client devrait être en mesure de voir vos assemblées dans la boîte de dialogue "Ajouter une référence" et peut l'utiliser.

Venons-en maintenant à votre problème réel,

Assembly.GetExecutingAssembly() retournera le chemin de l'endroit où les dll insatlled sont présents des pour. Trouvez le fichier XML à partir de là. :)

Remarque: Dans la clé de registre, la version 4.0.30319 est la version du .NET Framework que votre application cible. Utilisez la version que votre application cible à la place.