我正在研究运行时如何定位程序集,并且想知道是否有一种方法可以获取Assembly.Load
找到的程序集的路径,而不是实际加载它?
我需要这样做的原因是,AssemblyDefinition.ReadAssembly
from Mono.Cecil
需要一条直接到程序集的路径,并且不会花费额外的精力来尝试自己找到它。相反,我想将标准System.Reflection
和Mono.Cecil
的功能结合起来。
Mono.Cecil 使用程序集解析器从程序集名称获取AssemblyDefinition
。
AssemblyNameReference reference = AssemblyNameReference.Parse("Foo, Version=1.0.0.0");
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();
AssemblyDefinition foo = resolve.Resolve(reference);
新答案
您可能能够使用程序集名称。不幸的是,我不在我的开发机器上,所以我无法测试这个。但是AssemblyName用于Assembly.Load()的mscorlib实现中。
我深入研究了 CoreCLR,看看是否可以深入了解解析器实际查找文件的位置,但没有成功。如果这不起作用,您可以尝试自己潜入 CLR 以获取答案。我将其缩小到FindAssembly调用
var assemblyName = new AssemblyName("YourAssembly versionwhateveretc");
var path = new Uri(assemblyName.EscapedCodeBase).LocalPath;
旧答案
ReflectionOnlyLoad对你有用吗?
这应该允许您检查程序集元数据/与之交互,而无需将其完全加载到当前 AppDomain 中。