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

dnLib 生成的程序集 - 在运行时抛出 TypeLoadException

如何解决dnLib 生成的程序集 - 在运行时抛出 TypeLoadException

我正在使用 dnLib 从我正在编写的自定义语言(名为 CSASM)动态生成 MSIL 程序集:

string absolute = Path.Combine(Directory.GetCurrentDirectory(),forceOutput ?? $"{asmName}.exe");

ModuleDefUser mod = new ModuleDefUser(asmName,Guid.NewGuid(),new AssemblyRefUser(new AssemblyNameInfo(typeof(int).Assembly.GetName().FullName))){
    Kind = ModuleKind.Console,RuntimeVersion = "v4.0.30319"  //Same runtime version as "CSASM.Core.dll"
};
var asm = new AssemblyDefUser($"CSASM_program_{asmName}",new Version(version));
asm.Modules.Add(mod);

// Adding attribute code omitted for brevity

//Adds types to the module and constructs methods and method bodies for those types based on the CSASM source file in question
Construct(mod,source);

mod.Write(absolute);

可执行文件生成按预期工作。

但是,当尝试运行此可执行文件时,会抛出下面的 TypeLoadException

System.TypeLoadException: Could not load type 'CSASM.Core.IntPrimitive' from assembly
'CSASM_program_Example,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' due to
value type mismatch.
   at Example.Program.csasm_main()

CSASM_program_Example生成的可执行文件的程序集名称Example.exe

IntPrimitive 类型实际上是在 CSASM.Core.dll 程序集中找到的,它也与生成的可执行文件位于同一文件夹中。

由于关于 dnLib 的文档极度缺乏,我基本上是在这里摸黑摸索。


简而言之,是否存在试图从错误程序集中加载类型的原因?
如果是这样,有什么办法可以解决这个问题吗?

在 dnSpy 中查看程序集显示 TypeRefMemberRef 引用了正确的程序集,这使得这种困境更加令人沮丧。

解决方法

在对 dnLib DLL 进行非常彻底的检查后,问题是由于我使用了 Importer.ImportDeclaringType(Type).ToTypeDefOrRef(),导致值类型 TypeSig 被注册为类类型 TypeSig相反。

即使文档说在方法和字段声明中使用 Importer.ImportDeclaringType(Type) 而不是 Importer.ImportAsTypeSig(Type),你真的不应该使用它。

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