.NET Core使用System.Reflection.Emit创建动态类型加载失败怎么办
问题原因
你代码的问题是缺失了动态类型构建的最终提交步骤。使用TypeBuilder配置完类型的继承关系、构造函数等所有规则后,必须显式调用CreateType()方法,才能将完整的类型定义写入动态程序集。如果没有调用该方法,程序集中只会存在未完成的类型占位符,调用GetTypes()加载类型时就会抛出你遇到的加载失败异常。
修复方案
只需要取消你代码中注释的那行CreateType()调用即可,完整的动态类型构建代码如下:
// 定义动态类型 var typeName = "Child"; var typeBuilder = moduleBuilder.DefineType( typeName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, typeof(Base)); typeBuilder.DefineDefaultConstructor(MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName); // 新增/取消注释下面这行,完成类型创建 typeBuilder.CreateType();
调用CreateType()后,你配置的Child类型会被编译为合法的运行时类型写入动态程序集,此时再调用typeBuilder.Assembly.GetTypes()就能正常获取到该类型,不会再抛出异常。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

