如何在c#.Net中查找依赖程序集路径

如何在c#.Net中查找依赖程序集路径,c#,dll,reflection,.net-assembly,C#,Dll,Reflection,.net Assembly,我正在尝试获取依赖项程序集名称、从中加载依赖项DLL的位置以及依赖项DLL的依赖项 我正在获取“.exe”文件的路径作为输入 要查找依赖项,我使用以下代码 var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies(); “assemblies”是系统.Reflection.AssemblyName类对象的集合 我使用for each获取程序集名称列表以查找依赖项列表 如何获取每

我正在尝试获取依赖项程序集名称、从中加载依赖项DLL的位置以及依赖项DLL的依赖项

我正在获取“.exe”文件的路径作为输入

要查找依赖项,我使用以下代码

var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies();
“assemblies”
系统.Reflection.AssemblyName
类对象的集合

我使用for each获取程序集名称列表以查找依赖项列表

  • 如何获取每个依赖项程序集的位置

  • 如何获取依赖程序集的依赖关系?例如,如果我在MyApp应用程序中使用myAppBase.dll,如何获取myAppBase.dll的依赖项


  • 类似这样的内容应该会获取所有引用的程序集。要将AssemblyName转换为程序集,必须加载它。这将返回包含所有引用程序集的可枚举项。您不需要传入HashSet,它只用于递归调用以防止无限循环

    如果您不想继续加载这些,我建议将它们加载到单独的AppDomain中,然后卸载

    private static IEnumerable<Assembly> GetReferencedAssemblies(Assembly a, HashSet<string> visitedAssemblies = null)
    {
        visitedAssemblies = visitedAssemblies ?? new HashSet<string>();
        if (!visitedAssemblies.Add(a.GetName().EscapedCodeBase))
        {
            yield break;
        }
    
        foreach (var assemblyRef in a.GetReferencedAssemblies())
        {
            if (visitedAssemblies.Contains(assemblyRef.EscapedCodeBase)) { continue; }
            var loadedAssembly = Assembly.Load(assemblyRef);
            yield return loadedAssembly;
            foreach (var referenced in GetReferencedAssemblies(loadedAssembly, visitedAssemblies))
            {
                yield return referenced;
            }
    
        }
    }
    
    private静态IEnumerable GetReferencedAssemblys(程序集a,HashSet VisitedAssemblys=null)
    {
    VisitedAssemblys=VisitedAssemblys??新建HashSet();
    如果(!visitedAssemblys.Add(a.GetName().EscapedCodeBase))
    {
    屈服断裂;
    }
    foreach(a.GetReferencedAssemblys()中的var assemblyRef)
    {
    if(visitedAssemblys.Contains(assemblyRef.EscapedCodeBase)){continue;}
    var loadedAssembly=Assembly.Load(assemblyRef);
    屈服-返回载荷装配;
    foreach(GetReferencedAssembly(loadedAssembly,VisitedAssembly)中引用的变量)
    {
    参考收益率;
    }
    }
    }
    

    至于DLL位置,您可以使用
    程序集
    对象上的
    位置
    来检索该位置。

    @Stefan MSDN answers 1)通过查看“程序集”上的“位置”。2) 如果他可以从assembly对象获取应用程序的Depdencence,那么他肯定可以从其assembly对象获取引用程序集的引用程序集?我只是把这个问题看作是缺乏对文档的阅读和对流程的逻辑思考。总的来说,这似乎不费吹灰之力。@john:谢谢你的评论。您能告诉我如何从AssemblyName类获取assembly对象吗?我已经添加了我的建议。