微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Mono.Cecil 从 .Net Core 3.1 代码解析 .NET 程序集的引用?

如何解决如何使用 Mono.Cecil 从 .Net Core 3.1 代码解析 .NET 程序集的引用?

我的工具是用 .Net Core 3.1 编写的。它使用 Mono.Cecil 来分析给定的程序集,它针对 .NET 4.7.2

给定一个 AssemblyDeFinition 对象及其程序集引用之一,我希望获得与该引用对应的 AssemblyDeFinition 对象。

以下是观看窗口内容示例:

姓名 价值 类型
{SharpTop.DB.DL,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null} Mono.Cecil.AssemblyDeFinition
asmRef {mscorlib,Version=4.0.0.0,PublicKeyToken=b77a5c561934e089} Mono.Cecil.AssemblyNameReference

现在我想解析对实际定义的引用:

var asm = a.MainModule.AssemblyResolver.Resolve(asmRef);

但是,在检查 asm.MainModule.FileName 时,我得到 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.12\mscorlib.dll

这是错误的,因为原始程序集针对 .NET 4.7.2,所以我的理解是它的 mscorlib 引用应该解析为类似 c:\Windows\Microsoft.NET\Framework\v4.0.30319\ mscorlib.dllc:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2

我的结论 - 我错误地解析了程序集引用。那么 - 正确的方法是什么?

解决方法

您可能在 .NET Core 中构建了该工具,这意味着 Mono.Cecil 会认为它是核心程序集,并将从 .NET Core 位置而不是 .NET Framework GAC 解析程序集。

https://github.com/jbevain/cecil/blob/2f1077d7bb3527c3d821cb726a6d762abaea101a/Mono.Cecil/BaseAssemblyResolver.cs#L136

解决方案是将工具的目标框架设置为 .NET Framework 或编写自己的程序集解析器。

我认为 ILSpy 可以很好地参考如何实现自己的程序集解析器: https://github.com/icsharpcode/ILSpy/blob/aa1906b8f54c78f06d41557214ff5bbff9fb2e26/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs

经过进一步调查,确实是这样。 ILSpy 的解析器几乎可以与 Mono.Cecil 互换。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。