如何获取当前正在执行的程序集引用的所有程序集的路径?GetReferencedAssmblies()给了我AssemblyName[].我如何从那里到达它们的装载位置?
Han*_*ant 13
在装配程序之前,您无法知道.装配分辨率算法很复杂,您无法可靠地预测它将做什么.调用Assembly.Load(AssemblyName)覆盖将为您提供对程序集的引用,其Location属性将告诉您所需的内容.
但是,您真的不希望在JIT编译器执行之前预先加载程序集.这是低效的,问题的可能性不是零.例如,您可以AppDomain.AssemblyResolve在程序准备好响应之前触发事件.避免问这个问题.
根据 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);
}
Run Code Online (Sandbox Code Playgroud)
用法:
var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13400 次 |
| 最近记录: |