如何在c#.Net中找到依赖组装路径

问题描述 投票:3回答:1

我试图获取依赖程序集名称,从属DLL加载的位置以及从属DLL的依赖项。

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

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

var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies();

“组件”是System.Reflection.AssemblyName类对象的集合。

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

  1. 如何获取每个依赖程序集的位置?
  2. 如何获得依赖程序集的依赖关系?例如,如果在MyApp应用程序中使用myAppBase.dll,我如何获取myAppBase.dll的依赖项。
c# dll reflection .net-assembly
1个回答
3
投票

像这样的东西应该得到所有引用的程序集。要将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;
        }

    }
}

至于DLL位置,你可以在Location对象上使用Assembly来检索它。

© www.soinside.com 2019 - 2024. All rights reserved.