无法保存您的类型,因为它是在
.
AssemblyBuilder
的
Save
看到了吗
remarks
.
此方法保存此方法中定义的所有非瞬态动态模块
不保存瞬态动态模块。
程序集文件名可以与其中一个模块的名称相同。如果是,大会
清单存储在该模块中。assemblyFileName可以是
与中包含的所有模块的名称不同
装配。如果是,则程序集文件仅包含程序集
要持久化您的类型,您必须以非暂时形式声明它
持久动态模块
,使用
DefineDynamicModule
fileName
论点,像这样:
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName", "MyAssembly.dll");
您的完整代码如下所示。
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(new
AssemblyName("MyAssembly"), AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("ModuleName", "MyAssembly.dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType("MyNamespace.TypeName", TypeAttributes.Public);
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
// Build the method 'public int ReturnTheAnswer() => 42;'.
MethodBuilder newMethod = typeBuilder.DefineMethod("ReturnTheAnswer",
MethodAttributes.Public, typeof(int), new Type[0]);
ILGenerator ilGen = newMethod.GetILGenerator();
ilGen.Emit(OpCodes.Ldc_I4_S, 42);
ilGen.Emit(OpCodes.Ret);
Type newType = typeBuilder.CreateType();
assemblyBuilder.Save("MyAssembly.dll"); // Save the assembly in the programs work directory ('bin\Debug').
dynamic o = Activator.CreateInstance(newType); // Create an instance of the dynamically created type.
int r = (int) o.ReturnTheAnswer();
Debug.Assert(r == 42); // If this doesn't fail, the type has been built correctly, is in fact in the .dll and can be used perfectly fine.