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

How to just get the path of an assembly rather than loading it?

我正在查看 runtime locates assemblies 并想知道是否有一种方法可以只获取 Assembly.Load 找到的程序集的路径而不是实际加载它?

我需要这个的原因是因为 AssemblyDefinition.ReadAssembly 来自 Mono.Cecil 需要一个直接到程序集的路径,并且不会花费额外的努力来尝试自己定位它。相反,我想结合标准 System.ReflectionMono.Cecil.

的功能

新答案

您也许可以使用 AssemblyName。不幸的是我不在我的开发机器上所以我无法测试它。但是在 Assembly.Load() 的 mscorlib 实现中使用了 AssemblyName。

我深入研究了 CoreCLR,看看是否可以深入了解解析器实际查找文件但未成功的位置。如果这不起作用,您可以尝试自己深入 CLR 寻找答案。我将其缩小为 FindAssembly 调用

var assemblyName = new AssemblyName("YourAssembly versionwhateveretc");
var path = new Uri(assemblyName.EscapedCodeBase).LocalPath;

旧答案

ReflectionOnlyLoading对你有用吗?

这应该允许您 inspect/interact 使用程序集元数据而无需将其完全加载到当前 AppDomain 中。

Mono.Cecil 使用程序集解析器从程序集名称中获取 AssemblyDefinition

AssemblyNameReference reference = AssemblyNameReference.Parse("Foo, Version=1.0.0.0");
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver();
AssemblyDefinition foo = resolve.Resolve(reference);