获取依赖程序集

本文关键字:程序集 依赖 获取 | 更新日期: 2023-09-27 18:20:15

是否有方法获取依赖于给定程序集的所有程序集?

伪:

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

获取依赖程序集

如果您希望从当前应用程序域中找到依赖程序集,可以使用下面定义的类似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参数表示要查找其所有从属项的程序集。

在程序上,您可以使用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);
}

如果你不需要用程序来做这件事,那么NDepend或Reflector可以给你这些信息。

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

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

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

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

然后简单地(*)遍历作用域中的所有程序集,并使用反射检查它们是否依赖于目标程序集。

如果您想要间接引用和直接引用,则必须对找到的所有程序集进行漂洗和重复。

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

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

希望这能有所帮助。