如何使用 Mono.Cecil 从 .Net Core 3.1 代码解析 .NET 程序集的引用?
How to resolve references of a .NET assembly from a .Net Core 3.1 code using Mono.Cecil?
我的工具是用 .Net Core 3.1 编写的。它使用 Mono.Cecil 分析给定的程序集,该程序集针对 .NET 4.7.2
给定一个 AssemblyDefinition
对象及其一个程序集引用,我希望获得与该引用对应的 AssemblyDefinition
对象。
这里是一个例子观看window内容:
Name
Value
Type
a
{SharpTop.DB.DL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
Mono.Cecil.AssemblyDefinition
asmRef
{mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
Mono.Cecil.AssemblyNameReference
现在我想解决对实际定义的引用:
var asm = a.MainModule.AssemblyResolver.Resolve(asmRef);
但是,在检查 asm.MainModule.FileName
时,我得到 C:\Program Files\dotnet\shared\Microsoft.NETCore.App.1.12\mscorlib.dll
这是错误的,因为原始程序集的目标是 .NET 4.7.2,所以我的理解是它的 mscorlib 引用应该解析为类似 c:\Windows\Microsoft.[=42 的内容=].0.30319\mscorlib.dll 或者 c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2
我的结论 - 我错误地解析了程序集引用。那么 - 正确的方法是什么?
您可能在 .NET Core 中构建了该工具,这意味着 Mono.Cecil 会认为它是核心程序集并将解析来自 .NET Core 位置而不是 .NET Framework GAC 的程序集。
解决方案是将工具的目标框架设置为 .NET Framework 或编写您自己的程序集解析器。
我认为 ILSpy 可以很好地参考如何实现您自己的程序集解析器:
https://github.com/icsharpcode/ILSpy/blob/aa1906b8f54c78f06d41557214ff5bbff9fb2e26/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs
查了一下,确实是这样的做法。 ILSpy 的解析器几乎可以与 Mono.Cecil.
互换
我的工具是用 .Net Core 3.1 编写的。它使用 Mono.Cecil 分析给定的程序集,该程序集针对 .NET 4.7.2
给定一个 AssemblyDefinition
对象及其一个程序集引用,我希望获得与该引用对应的 AssemblyDefinition
对象。
这里是一个例子观看window内容:
Name | Value | Type |
---|---|---|
a | {SharpTop.DB.DL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} | Mono.Cecil.AssemblyDefinition |
asmRef | {mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} | Mono.Cecil.AssemblyNameReference |
现在我想解决对实际定义的引用:
var asm = a.MainModule.AssemblyResolver.Resolve(asmRef);
但是,在检查 asm.MainModule.FileName
时,我得到 C:\Program Files\dotnet\shared\Microsoft.NETCore.App.1.12\mscorlib.dll
这是错误的,因为原始程序集的目标是 .NET 4.7.2,所以我的理解是它的 mscorlib 引用应该解析为类似 c:\Windows\Microsoft.[=42 的内容=].0.30319\mscorlib.dll 或者 c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2
我的结论 - 我错误地解析了程序集引用。那么 - 正确的方法是什么?
您可能在 .NET Core 中构建了该工具,这意味着 Mono.Cecil 会认为它是核心程序集并将解析来自 .NET Core 位置而不是 .NET Framework GAC 的程序集。
解决方案是将工具的目标框架设置为 .NET Framework 或编写您自己的程序集解析器。
我认为 ILSpy 可以很好地参考如何实现您自己的程序集解析器: https://github.com/icsharpcode/ILSpy/blob/aa1906b8f54c78f06d41557214ff5bbff9fb2e26/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs
查了一下,确实是这样的做法。 ILSpy 的解析器几乎可以与 Mono.Cecil.
互换