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();
Était-ce utile?

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:.

  1. Tous les assemblages dans le répertoire bin de mon application

  2. Tous les assemblages dans le répertoire bin de mon application + tous ensembles dans le GAC

  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top