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

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

在assembly程序之前,您无法知道。 assembly分辨率算法很复杂,您无法可靠地预测它将做什么。 调用Assembly.Load(AssemblyName)覆盖将获得对程序集的引用,其Location属性将告诉您所需的内容。

但是,您真的不希望在JIT编译器执行之前预先加载程序集。 这是低效的,问题的可能性不是零。 例如,您可以在程序准备好响应之前触发AppDomain.AssemblyResolve事件。 避免问这个问题。

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

 IEnumerable 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); 

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

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

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