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

时间:2017-11-05 08:54:11

标签: .net reflection mono.cecil

我正在研究runtime locates assemblies我是如何想知道是否有办法让Assembly.Load找到一个程序集的路径而不是实际加载它?

我需要这样做的原因是因为来自AssemblyDefinition.ReadAssembly的{​​{1}}需要一条直接连接到程序集的路径,并且不会为尝试为自己找到它而付出额外的努力。我希望将标准Mono.CecilSystem.Reflection的功能结合起来。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

新答案

您可以使用AssemblyName。不幸的是,我不在我的开发机器上,所以我无法对此进行测试。但AssemblyName用于Assembly.Load()的mscorlib实现。

我深入了解CoreCLR,看看我是否可以深入了解解析器实际查找文件的位置,但未成功。如果这不起作用,您可以尝试自己潜入CLR寻求答案。我把它缩小到FindAssembly电话

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

旧答案

ReflectionOnlyLoading是否适合您?

这应该允许您检查/交互程序集元数据,而无需将其完全加载到当前的AppDomain中。