如何只获取程序集的路径而不是加载它



我正在研究运行时如何定位程序集,并且想知道是否有一种方法可以获取Assembly.Load找到的程序集的路径,而不是实际加载它?

我需要这样做的原因是,AssemblyDefinition.ReadAssembly from Mono.Cecil 需要一条直接到程序集的路径,并且不会花费额外的精力来尝试自己找到它。相反,我想将标准System.ReflectionMono.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 中。

最新更新