获得依赖程序集?

时间:2012-01-13 10:44:13

标签: c# .net reflection .net-assembly

有没有办法让所有程序集都依赖于给定的程序集?

伪:

Assembly a = GetAssembly();
var dependants = a.GetDependants();

4 个答案:

答案 0 :(得分:15)

如果您希望从当前应用程序域中找到依赖程序集,可以使用类似下面定义的GetDependentAssemblies函数:

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);
}

analyzedAssembly参数表示要为其查找所有依赖项的程序集。

答案 1 :(得分:7)

以编程方式,您可以使用Mono.Cecil来执行此操作。

这样的事情(请注意,如果附加了调试器,这将无效 - 例如,如果您从VS内部运行它):

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);
}

如果您不需要以编程方式执行此操作,则NDependReflector可以为您提供此信息。

答案 2 :(得分:2)

首先定义您的范围,例如:

  1. 我的应用程序的bin目录中的所有程序集

  2. 我的应用程序的bin目录中的所有程序集+ GAC中的所有程序集

  3. 世界上任何一台机器上的所有组件。

  4. 然后简单地(*)遍历范围内的所有程序集,并使用反射来检查它们是否依赖于目标程序集。

    如果你想要间接和直接参考,你必须冲洗并重复你找到的所有组件。

    (*)如果你的范围是3以上,可能不是那么简单。

答案 3 :(得分:1)

我不知道在运行时获取依赖项的任何内置可能性。 所以我认为最简单的解决方案是定义扩展方法并使用this应用程序中的代码。几年前我使用了一个应用程序。但使用它的代码。

希望这有帮助。