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

3

我正在尝试获取依赖程序集的名称,从中加载相关DLL的位置以及所依赖的DLL。

我将".exe"文件路径作为输入。

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

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

"assemblies" 是一组 System.Reflection.AssemblyName 类对象。
我正在使用 for-each 来获取程序集名称列表以查找依赖项列表。
  1. 如何获取每个依赖程序集的位置?

  2. 如何获取依赖于其他程序集的依赖项?例如,如果在 MyApp 应用程序中使用 myAppBase.dll,如何获取 myAppBase.dll 的依赖项。


3
@Stefan MSDN回答:1)通过查看“Assembly”的“Location”。2)如果他可以从程序集对象获取应用程序的依赖项,那么他肯定可以从它们的程序集对象获取引用程序集的引用程序集?我认为这个问题缺乏阅读文档和逻辑思考过程。总的来说,这似乎是低投入的。 - ProgrammingLlama
@john:感谢您的评论。您能告诉我如何从AssemblyName类中获取程序集对象吗? - Venkat
1
我已经添加了我的建议。 - ProgrammingLlama
1个回答

3

以下代码可以获取所有已引用的程序集。要将AssemblyName转换为Assembly,您需要加载它。这将返回一个包含所有已引用程序集的可枚举对象。您不需要传递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的位置,您可以使用Assembly对象上的Location来检索它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接