如何获取当前正在执行的程序集引用的所有程序集的路径? GetReferencedAssmblies()
给了我 AssemblyName[]
秒。我如何从那里到达它们的装载位置?
如何获取当前正在执行的程序集引用的所有程序集的路径? GetReferencedAssmblies()
给了我 AssemblyName[]
秒。我如何从那里到达它们的装载位置?
在装配程序之前,您无法知道。装配分辨率算法很复杂,您无法可靠地预测它将做什么。打电话给 Assembly.Load(AssemblyName)
override将为您提供对程序集的引用,其Location属性将告诉您所需的内容。
但是,你 真 不想在前面加载组件, 之前 JIT编译器做到了。这是低效的,问题的可能性不是零。你可以举个例子 AppDomain.AssemblyResolve
在程序准备好响应它之前的事件。避免问这个问题。
继汉斯帕斯特的回答之后,以及 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);
该 CodeBase
property应提供完整路径名。
您可以像这样获取程序集的URL位置:
Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase