web-dev-qa-db-fra.com

Chemin d'accès de DLL installée sur le GAC

Comment puis-je obtenir le chemin d'installation (physique) d'un DLL qui est (peut être) enregistré dans GAC? This DLL est un contrôle qui peut être hébergé) dans des choses autres 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 Conception dans VS donne le chemin vers VS IDE.

J'ai besoin d'obtenir le chemin où la DLL physique est réellement installée - ou le dossier bin/debug ou (release) pour VS.

La raison en est qu'il y a un fichier XML que je dois consulter dans ce dossier, avec des paramètres de configuration qui sont utilisés à la fois en mode conception et au moment de 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 de conception en ce moment ... (Ne pensez pas que le dossier ApplicationData va le couper (mais ayez la version .Net déplacée car elle est installée via ClickOnce et peut utiliser les données Clickonce dossier))

24
kpollock

Si quelque chose est placé dans le GAC, il est en fait copié dans un emplacement sous% WINDIR%\Assembly, comme

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

Je suppose que vous voyez quelque chose comme ça lorsque vous vérifiez l'emplacement de l'Assemblée en question lorsqu'elle est installée dans le GAC. C'est en fait correct. (Dans .NET 1.1, il y avait une "base de code" répertoriée lorsque vous regardiez les propriétés d'un assembly GAC, mais c'était uniquement pour vous montrer où se trouvait le fichier d'origine lorsque vous exécutiez gacutil - cela n'indiquait pas réellement ce qui serait chargé. ) Vous pouvez lire plus à ce sujet ici .

Pour faire court, vous ne pourrez peut-être pas faire ce que vous voulez faire. Au lieu de chercher par rapport à un assembly en cours de chargement (Assembly.GetExecutingAssembly()), vous souhaiterez peut-être changer le comportement pour qu'il ressemble à l'assembly de l'application principale (Assembly.GetEntryAssembly()) ou placer le fichier dans un emplacement bien connu, éventuellement basé sur une variable d'environnement définie.

23
Travis Illig

Une fois l'assembly copié en ombre dans le cache de l'assembly global, je ne pense pas qu'il existe de métadonnées pour retracer l'emplacement des assemblys source.

Qu'essayez-vous de réaliser en déployant dans GAC? Si c'est juste pour le bien de CLR à des fins de résolution, alors il existe une autre façon de résoudre votre problème.

N'installez pas gac la dll, ajoutez plutôt la clé suivante dans le registre (cet emplacement de registre est recherché par CLR lors de la tentative de résolution des assemblys)

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à où votre assemblage existe. (le chemin absolu est préféré)

Désormais, à partir de Visual Studio, votre client doit pouvoir voir vos assemblys dans la boîte de dialogue "Ajouter une référence" et peut l'utiliser.

Passons maintenant à votre problème réel,

Assembly.GetExecutingAssembly() renverra le chemin de l'emplacement où les DLL insatllées sont présentes. Trouvez le fichier XML à partir de là. :)

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

3
Soundararajan

Avez-vous la possibilité d'incorporer une ressource dans cette DLL? De cette façon, peu importe où se trouve le DLL 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());
}
3
BFree

Si vous recherchez 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 ne trouvez pas votre dossier associé DLL là-dedans, vous pouvez créer un dossier "Up" dans l'Explorateur Windows pour afficher tout dans c:\windows\Assembly sous forme de structures de dossiers. Vous pouvez ensuite rechercher votre DLL sous GAC_MSIL ou tout autre dossier là-bas ....

À la vôtre, Sri

2
Sri