如何只获取程序集的路径而不是加载它?
How to just get the path of an assembly rather than loading it?
我正在查看 runtime locates assemblies 并想知道是否有一种方法可以只获取 Assembly.Load
找到的程序集的路径而不是实际加载它?
我需要这个的原因是因为 AssemblyDefinition.ReadAssembly
来自 Mono.Cecil
需要一个直接到程序集的路径,并且不会花费额外的努力来尝试自己定位它。相反,我想结合标准 System.Reflection
和 Mono.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);
我正在查看 runtime locates assemblies 并想知道是否有一种方法可以只获取 Assembly.Load
找到的程序集的路径而不是实际加载它?
我需要这个的原因是因为 AssemblyDefinition.ReadAssembly
来自 Mono.Cecil
需要一个直接到程序集的路径,并且不会花费额外的努力来尝试自己定位它。相反,我想结合标准 System.Reflection
和 Mono.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);