我很难理解如何创建动态程序集,下面是一些代码:
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.DefineMethod
,TypeBuilder.DefineField
,TypeBuilder.DefineConstructor
等都不会“引入”元数据吗?
TypeBuilder.DefineXXX
自动“写入”或“引入”元数据是否更明智,所以不再需要AssemblyBuilder.CreateType()?