Obtenez des assemblages à charge?
-
27-10-2019 - |
Question
Y at-il un moyen d'obtenir toutes les assemblées qui dépendent d'un assemblage donné?
Pseudo:
Assembly a = GetAssembly();
var dependants = a.GetDependants();
La solution
Si vous souhaitez trouver les assemblées qui dépendent du domaine d'application actuel, vous pouvez utiliser quelque chose comme la fonction GetDependentAssemblies
définie ci-dessous:
private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly)
{
return AppDomain.CurrentDomain.GetAssemblies()
.Where(a => GetNamesOfAssembliesReferencedBy(a)
.Contains(analyzedAssembly.FullName));
}
public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly)
{
return assembly.GetReferencedAssemblies()
.Select(assemblyName => assemblyName.FullName);
}
Le paramètre analyzedAssembly
représente l'ensemble pour lequel vous voulez trouver toutes les personnes à charge.
Autres conseils
Programatically, vous pouvez utiliser Mono.Cecil pour le faire.
Quelque chose comme ceci (notez cela ne fonctionnera pas si le débogueur est attaché - par exemple si vous exécutez à l'intérieur VS lui-même):
public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath)
{
//On my box, once I'd installed Mono, Mono.Cecil could be found at:
//C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll
var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath);
return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName);
}
Si vous n'avez pas besoin de le faire programatically, puis NDepend ou réflecteur peut vous donner ces informations.
Tout d'abord définir votre portée, par exemple:.
-
Tous les assemblages dans le répertoire bin de mon application
-
Tous les assemblages dans le répertoire bin de mon application + tous ensembles dans le GAC
-
Toutes les assemblées sur une machine dans le monde.
Ensuite, il suffit (*) itérer à travers toutes les assemblées de votre portée, et la réflexion de l'utilisation pour vérifier si elles dépendent de votre assemblage cible.
Si vous voulez indirecte, ainsi que des références directes, vous devrez rincer et répéter pour toutes les assemblées que vous trouvez.
(*) pourrait ne pas être si simple si votre portée est 3 ci-dessus.
Je ne suis pas au courant d'aucune possibilité intégrée pour obtenir des dépendances à l'exécution. Je pense donc que la solution la plus simple est de définir une méthode d'extension et utiliser le code de cette application . J'ai utilisé une application elle-même il y a quelques années. Mais ne pas code d'utilisation de celui-ci.
Hope this helps.