C# 获取依赖程序集?

C# 获取依赖程序集?,c#,.net,reflection,.net-assembly,C#,.net,Reflection,.net Assembly,是否有方法获取依赖于给定程序集的所有程序集 伪: Assembly a = GetAssembly(); var dependants = a.GetDependants(); 通过编程,您可以使用 类似这样的情况(请注意,如果附加了调试器,这将不起作用-例如,如果从VS本身内部运行调试器): 公共静态IEnumerable GetDependentAssembly(字符串汇编文件路径) { //在我的盒子上,一旦我安装了Mono,Mono.Cecil可以在以下位置找到: //C:\Progr

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

伪:

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

通过编程,您可以使用

类似这样的情况(请注意,如果附加了调试器,这将不起作用-例如,如果从VS本身内部运行调试器):

公共静态IEnumerable GetDependentAssembly(字符串汇编文件路径)
{
//在我的盒子上,一旦我安装了Mono,Mono.Cecil可以在以下位置找到:
//C:\ProgramFiles(x86)\Mono-2.10.8\lib\Mono\gac\Mono.Cecil\0.9.4.0\uuuu 0738eb9f132ed756\Mono.Cecil.dll
var assembly=AssemblyDefinition.ReadAssembly(assemblyFilePath);
返回assembly.MainModule.AssemblyReferences.Select(reference=>reference.FullName);
}

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

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


希望这有帮助。

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

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

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

  • 世界上任何机器上的所有组件

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

    如果需要间接引用和直接引用,则必须对找到的所有部件进行冲洗和重复


    (*)如果您的作用域是上面的3,可能就不那么简单了。

    如果您希望从当前应用程序域中查找依赖程序集,可以使用下面定义的
    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);
    }
    
    private IEnumerable GetDependentAssembly(程序集分析程序集)
    {
    返回AppDomain.CurrentDomain.GetAssemblys()
    .其中(a=>GetNamesofAssembliseSReferenceBy(a)
    .Contains(analyzedAssembly.FullName));
    }
    公共IEnumerable GetNamesofAssemblysReferenceBy(程序集)
    {
    返回assembly.getReferencedAssemblys()
    .选择(assemblyName=>assemblyName.FullName);
    }
    

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

    是否需要编程?如果没有,您可以使用MS Depends进行编程。我需要在所有依赖类型上使用。您如何定义范围?程序集可以知道它所依赖的是什么,但它能说出它所依赖的是什么吗+问题1;)@juergend dependens.exe不显示.NET/托管依赖项。您的代码返回由
    assemblyFilePath
    指向的程序集引用的程序集列表,不是吗?这就是OP要问的吗?我认为(可能是错误的)OP想要相反的结果:给定一个程序集
    A
    查找引用它的所有程序集。我错过什么了吗?啊-也许你是对的-现在还不确定。这取决于你是否阅读了标题(这表明我在这里回答了什么),或者文字描述(这表明你是对的)!同意,这有点混乱。但如果我是对的,那么OP可能必须首先回答StaWho在评论中提出的问题!除了搜索“范围”中的每个程序集并为每个程序集执行代码之外,我看不到其他解决问题的方法。包括我在内的每个人都是一个白痴,想想看。简单明了。+1不错。我以前从未见过Assembly.getReferencedAssemblys()。看起来它是在.NET4中添加的。嗯,你每天都能学到一些东西。
    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);
    }