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?