问题 获取所有引用程序集的路径


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


13031
2017-11-16 11:09


起源

尝试这个 stackoverflow.com/questions/1582510/... - Jason Evans
非常感谢。这解决了我。 - Water Cooler v2
有关如何以递归方式获取所有引用的程序集的完整工作示例,请参阅 stackoverflow.com/questions/383686/...。 - Contango


答案:


在装配程序之前,您无法知道。装配分辨率算法很复杂,您无法可靠地预测它将做什么。打电话给 Assembly.Load(AssemblyName) override将为您提供对程序集的引用,其Location属性将告诉您所需的内容。

但是,你  不想在前面加载组件, 之前 JIT编译器做到了。这是低效的,问题的可能性不是零。你可以举个例子 AppDomain.AssemblyResolve 在程序准备好响应它之前的事件。避免问这个问题。


12
2017-11-16 12:00



非常感谢您的正确答案。 - Water Cooler v2


继汉斯帕斯特的回答之后,以及 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);

3
2018-03-04 18:16



在未加载程序集时避免返回空值是个好主意(只需继续循环)。 - Slobodan Savkovic
好主意@SlobodanSavkovic,我已经更新了我的答案。 - Jerther


CodeBase property应提供完整路径名。


0
2017-11-16 11:17



你试过吗? - Hans Passant
不幸的是,CodeBase在每个引用的程序集上返回null。 :-) - Water Cooler v2


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

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

0
2017-11-16 11:26



CodeBase返回null。解决方案是JasonEvans在他对原始帖子的评论中所关联的帖子。此外,Hans Passant也有正确的答案。 - Water Cooler v2