dnLib 生成的程序集 - 在运行时抛出 TypeLoadException
dnLib-Generated Assembly - TypeLoadException Thrown at Runtime
我正在使用 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 中查看程序集显示 TypeRef
s 和 MemberRef
s 引用了正确的程序集,这使得这种困境更加令人沮丧。
在对 dnLib DLL 进行了非常彻底的检查后,问题是由于我使用 Importer.ImportDeclaringType(Type).ToTypeDefOrRef()
,导致值类型 TypeSig
s 被注册为 class 类型TypeSig
s 代替。
即使文档说使用 Importer.ImportDeclaringType(Type)
而不是 Importer.ImportAsTypeSig(Type)
来声明方法和字段,您真的不应该使用它。
我正在使用 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 中查看程序集显示 TypeRef
s 和 MemberRef
s 引用了正确的程序集,这使得这种困境更加令人沮丧。
在对 dnLib DLL 进行了非常彻底的检查后,问题是由于我使用 Importer.ImportDeclaringType(Type).ToTypeDefOrRef()
,导致值类型 TypeSig
s 被注册为 class 类型TypeSig
s 代替。
即使文档说使用 Importer.ImportDeclaringType(Type)
而不是 Importer.ImportAsTypeSig(Type)
来声明方法和字段,您真的不应该使用它。