Comment puis-je énumérer tous les assemblages disponibles dans GAC en C #? P>
En fait, je suis confronté à un problème avec un code stupide - l'assemblage appelé Telerik.web.ui.dll est renvoyé et utilisé dans le projet - Cette DLL particulière n'est pas présente dans le dossier BIN. Et l'application fonctionne bien sur le serveur - mais sur ma machine, évidemment compiler donne une erreur. Ex-développeur insiste sur le fait que ce n'est pas dans le GAC sur le serveur et "c'est ce qu'il est". Maintenant, je dois vérifier si cette DLL est enregistrée dans GAC ou non. P>
aider sera apprécié. P>
bonne journée; p>
8 Réponses :
Vérifiez ce Interface API de CODEPROJECT GAC Article. Cela utilise une fusion non documentée.dll à énumérer le GAC. Mais l'auteur affirme que P>
Ce code est connu pour fonctionner avec .NET 1.1 et 2.0. Veuillez noter que la dll fusion.dll est différente dans 1.1 et 2.0. Donc, si vous avez les deux structures installées, assurez-vous de pointer le code à la bonne dll. Sinon la plupart Les appels d'API échoueront. Le défaut La mise en œuvre utilise celui trouvé dans le répertoire Windows. p> blockQuote>
merci - vérifiera; Mais je crains que cela puisse créer un problème avec des autorisations; Comme je dispose d'un accès limité au serveur - et je doute de sa fonctionnalité sous l'utilisateur ASP NET. Mais merci quand même; Je l'ai vu plus tôt aussi, mais exclu du moindre doute ci-dessus. Mais Lemme lui donne un essai.
Ce n'est pas sans papiers. Au moins plus non plus. support.microsoft.com/kb/317540 ou msdn.microsoft.com/en-us/library/ms404523.aspx
Vous n'avez pas vraiment besoin d'écrire quelque chose dans C # pour savoir si cette DLL spécifique est dans le GAC. Vous pouvez utiliser gacutil.exe avec le / l Option de la ligne de commande pour répertorier le contenu du GAC. P>
J'aimerais pouvoir - j'ai un accès limité au serveur - c'est-à-dire FTP uniquement :) mais toujours, merci pour le commentaire
@effkay - désolé que ce n'était pas utile. Si vous avez un accès limité au serveur, comment une solution de code aidera-t-elle?
@Miketwo sonne comme il envisage de télécharger une page Web qui énumérera les assemblages dans le GAC.
Si vous avez un accès limité au serveur, cela pourrait fonctionner:
// List of all the different types of GAC folders for both 32bit and 64bit // environments. List<string> gacFolders = new List<string>() { "GAC", "GAC_32", "GAC_64", "GAC_MSIL", "NativeImages_v2.0.50727_32", "NativeImages_v2.0.50727_64", "NativeImages_v4.0.30319_32", "NativeImages_v4.0.30319_64" }; foreach (string folder in gacFolders) { string path = Path.Combine( Environment.ExpandEnvironmentVariables(@"%systemroot%\assembly"), folder); if(Directory.Exists(path)) { Response.Write("<hr/>" + folder + "<hr/>"); string[] assemblyFolders = Directory.GetDirectories(path); foreach (string assemblyFolder in assemblyFolders) { Response.Write(assemblyFolder + "<br/>"); } } }
Peut-être que vous avez besoin de la visionneuse GAC quelque chose comme ceci: p>
p>
Vidéo: Comment utiliser Ajouter une boîte de dialogue Références GAC P>
J'espère que cela aide p>
s p>
Cela n'aidera pas comme il a dit qu'il n'a qu'un accès FTP au serveur. Il veut pouvoir énumérer le GAC en utilisant le code C # exécuté dans un environnement de confiance inférieur à celui de la confiance.
Si c'est un site simple-Jane ASP.NET, et que l'assemblage n'est pas dans le dossier bin du site ou dans le GAC du serveur (et il n'y a rien de poisson dans le web.config), peut-être que le site est un sous-site de une sorte et l'un des plus hauts du site contient la référence dans le dossier bin (ou quelque chose de poisson dans son web.config, puisque les sous-sites / dossiers héritent du web.configs de leurs parents)?
Maintenant, si vous avez Un environnement où le fichier est en cours de chargement correctement (et on dirait comme vous le ferez), vous pouvez simplement demander .NET où le fichier .dll apparaît et affiche plutôt que, par exemple: P>
static void ProcessFile(string file) { try { Assembly a = Assembly.LoadFile(file); Console.WriteLine(a.GetName().FullName); } catch { /* do nothing */ } } static void ProcessFolder(string folder) { foreach (string file in Directory.GetFiles(folder)) { ProcessFile(file); } foreach (string subFolder in Directory.GetDirectories(folder)) { ProcessFolder(subFolder); } } static void Main(string[] args) { ProcessFolder(@"C:\Windows\Assembly"); }
Une méthode simple pour énumérer des fichiers DLL dans un répertoire et vous pouvez obtenir tous les fichiers p> si vous devez charger Chaque assemblée, vous obtenez une exception pour différentes versions d'exécution. Pour cette raison, vous pouvez charger l'assemblage avec assemblage.reflectionnloadloadfrom A> Pour charger l'assemblage en réflexion uniquement. Ensuite, l'assemblage ne charge pas dans votre AppDomain et ne jetez pas d'exception. P> p>
Figure Je pourrais aussi bien lancer dans ma solution à base de Linq (pratique si vous recherchez simplement un seul fichier et que vous ne voulez pas énumérer à chaque fichier)
fonction pour trouver les fichiers: p>
string path = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\..\\assembly"; foreach (string s in FindFiles(path, "*.dll")) { Console.WriteLine(s); }
@Effkey - Avez-vous réussi à résoudre ce problème?
nop; Je n'étais pas capable de; Plutôt j'ai téléchargé les fichiers .dll de Torrents (même version) et ils ont fonctionné. Je ne comprends toujours pas d'où ASP .NET ramasse la Dllz si elles ne sont pas dans GAC.