【问题标题】:Get the paths of all referenced assemblies获取所有引用程序集的路径
【发布时间】:2010-11-16 11:09:49
【问题描述】:

如何获取当前正在执行的程序集所引用的所有程序集的路径? GetReferencedAssmblies() 给了我AssemblyName[]s。我如何从那里到达它们的加载位置?

【问题讨论】:

标签: c# reflection


【解决方案1】:

在加载程序集之前您无法知道。程序集解析算法很复杂,您无法可靠地预先猜出它会做什么。调用 Assembly.Load(AssemblyName) 覆盖将为您提供对程序集的引用,它的 Location 属性会告诉您您需要什么。

但是,您真的不想预先加载程序集, JIT 编译器会这样做。它效率低下,出现问题的可能性也不为零。例如,您可以在程序准备好响应之前触发AppDomain.AssemblyResolve 事件。避免问这个问题。

【讨论】:

    【解决方案2】:

    按照 Hans Passant 的回答,由于 CodeBase 属性始终包含 null,我想出了这个。它可能找不到所有程序集,因为它们可能尚未全部加载。在我的情况下,我必须找到以前加载的程序集的所有引用,所以它运行良好:

    IEnumerable<string> GetAssemblyFiles(Assembly assembly)
    {
        var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        return assembly.GetReferencedAssemblies()
            .Select(name => loadedAssemblies.SingleOrDefault(a => a.FullName == name.FullName)?.Location)
            .Where(l => l != null);
    }
    

    用法:

    var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly);
    

    【讨论】:

    • 最好避免在程序集未加载时返回空值(继续循环)。
    • 好主意@SlobodanSavkovic,我已经更新了我的答案。
    【解决方案3】:

    CodeBase 属性应提供完整路径名。

    【讨论】:

    • 不幸的是,CodeBase 在每个引用的程序集上都返回 null。 :-)
    【解决方案4】:

    您可以像这样获取程序集的 URL 位置:

    Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase
    

    【讨论】:

    • CodeBase 返回空值。解决方案在 JasonEvans 在对原始帖子的评论中链接到的帖子中。此外,Hans Passant 也有正确的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2010-10-26
    相关资源
    最近更新 更多