调用TypeBuilder.CreateType()的目的是什么

时间:2019-06-24 05:40:23

标签: c# .net dynamic-assemblies

我很难理解如何创建动态程序集,下面是一些代码:

public static void CreateMyAsm(AppDomain curAppDomain)
{
   AssemblyName assemblyName = new AssemblyName();
   assemblyName.Name = "MyAssembly";
   assemblyName.Version = new Version("1.0.0.0");
   AssemblyBuilder assembly = curAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
   ModuleBuilder module =
   assembly.DefineDynamicModule("zMyAssembly", "zMyAssembly.dll");
   TypeBuilder helloWorldClass = module.DefineType("zMyAssembly.HelloWorld", TypeAttributes.Public);

  /*
   ...configure ConstructorBuilder, FieldBuilder, MethodBuilder  etc with ILGenerator.Emit() here

  ConstructorBuilder constructor = helloWorldClass.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, constructorArgs);
  ILGenerator constructorIL = constructor.GetILGenerator();
  ...
  FieldBuilder msgField = helloWorldClass.DefineField("theMessage", Type.GetType("System.String"),FieldAttributes.Private);
  constructorIL.Emit(OpCodes.Stfld, msgField);
  */  
   helloWorldClass.CreateType();
   assembly.Save("MyAssembly.dll");
}

所以我的问题是,为什么我们需要调用创建类型的helloWorldClass.CreateType();

因为我们在主要方法中通常不会通过以下方式获得Type:

static void Main(string[] args)
{
   ...
   Type t = Type.GetType("MyAssembly.HelloWorld, MyAssembly");
   ...
}

那么我们可以动态获取类型吗?

编辑: 有人说 Type.GetType返回现有的元数据。 AssemblyBuilder.CreateType引入了新的元数据。

因此所有TypeBuilder.DefineMethodTypeBuilder.DefineFieldTypeBuilder.DefineConstructor等都不会“引入”元数据吗?

>在旅途中自动调用TypeBuilder.DefineXXX自动“写入”或“引入”元数据是否更明智,所以不再需要AssemblyBuilder.CreateType()?

0 个答案:

没有答案