0

I have difficulty in understanding in creating a dynamic assembly, below is some code:

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");
}

so my question is, why do we need to call helloWorldClass.CreateType();, which creates a type?

Because we normailly get a Type in the main method as:

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

so we can get the type dynamically?

EDIT: someone says Type.GetType returns existing metadata. AssemblyBuilder.CreateType introduces new metadata.

so all the TypeBuilder.DefineMethod, TypeBuilder.DefineField, TypeBuilder.DefineConstructor etc don't 'introduce' metadata? shouldn't it be more sensible that calling TypeBuilder.DefineXXX automatically 'write' or 'introduce' metadata on the go, so AssemblyBuilder.CreateType() is not needed anymore?

  • `Type.GetType` returns existing metadata. `AssemblyBuilder.CreateType` introduces new metadata. – thehennyy Jun 24 '19 at 05:53
  • @thehennyy so all the `TypeBuilder.DefineMethod`, `TypeBuilder.DefineField`, `TypeBuilder.DefineConstructor` etc don't 'introduce' metadata? shouldn't it be more sensible that calling `TypeBuilder.DefineXXX` automatically 'write' or 'introduce' metadata on the go, so AssemblyBuilder.CreateType is not needed anymore? –  Jun 24 '19 at 06:15
  • 1
    TypeBuilder is a factory, normally, factories only have one `Create` method that finishes the object being built, allowing no further modifications – Camilo Terevinto Jun 24 '19 at 06:25

0 Answers0