C#动态创建和动态使⽤程序集、类、⽅法、字段等(⼀)
  有时候在整个项⽬架构⾥也需要动态创建程序集的需求,那如何创建程序集呢,请跟我来学习⼀下吧。
  ⾸先需要知道动态创建这些类型是使⽤的⼀些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使⽤反射,那么动态创建也⼀样使⽤的是反射,是属于反射的技术!也就是将对象或者数据映射成⼀个对象或者程序集保存起来⽽已。
  ⾸先我们需要了解每个动态类型在中都是⽤什么类型来表⽰的。
程序集:System.Reflection.Emit.AssemblyBuilder(定义并表⽰动态程序集)
构造函数:System.Reflection.Emit.ConstructorBuilder(定义并表⽰动态类的构造函数)
⾃定义属性:System.Reflection.Emit.CustomAttributeBuilder(帮助⽣成⾃定义属性使⽤构造函数传递的参数来⽣成类的属性)
枚举:System.Reflection.Emit.EnumBuilder(说明并表⽰枚举类型)
事件:System.Reflection.Emit.EventBuilder(定义类的事件)
字段:System.Reflection.Emit.FieldBuilder(定义并表⽰字段。⽆法继承此类)
局部变量:System.Reflection.Emit.LocalBuilder(表⽰⽅法或构造函数内的局部变量)
⽅法:System.Reflection.Emit.MethodBuilder(定义并表⽰动态类的⽅法(或构造函数))
模块:System.Reflection.Emit.ModuleBuilder(定义和表⽰动态程序集中的模块)
参数:System.Reflection.Emit.ParameterBuilder(创建或关联参数信息如:⽅法参数,事件参数等)
属性:System.Reflection.Emit.PropertyBuilder(定义类型的属性 (Property))
类:System.Reflection.Emit.TypeBuilder(在运⾏时定义并创建类的新实例)
  我们有了这些类型,基本上就可以动态创建我们的任何需要使⽤的类型,当然很多可以动态创建的类型我不可能都介绍完,如果在项⽬中有需要可以去查阅MSDN,⾥⾯都有DEMO的,主要的问题就是要理解每⼀种类型的定义,⽐如:程序集加载是靠AppDomain,程序集⾥包含多个模块,模块⾥可以声明类,类⾥可以创建⽅法、属性、字段。⽅法需要在类中才可以创建的,局部变量是声明在⽅法体内等等规则。看MSDN就⾮常容易弄懂了。
1.如何动态创建它们了
AppDomain:应⽤程序域(由 AppDomain 对象表⽰)为执⾏托管代码提供隔离、卸载和安全边界。AppDomain同时可以载⼊多个程序集,共同来实现功能。
程序集:简单来说就是⼀个以公共语⾔运⾏库(CLR)为宿主的、版本化的、⾃描述的⼆进制⽂件。(说明:定义来⾃C#与.NET3.5⾼级程序设计(第四版))
模块:类似于以前的单元,⽤于分割不同的类和类型,以及资源(resource, 资源记录就是字符串,图象以及其它数据,他们只在需要的时候才会被调⼊内存)。类型的Meta信息也是模块的⼀部分。多个模块组建成⼀个程序集。
所谓动态就是在程序运⾏时,动态的创建和使⽤。
直接看代码吧,其实超级简单。
//动态创建程序集
AssemblyName DemoName = new AssemblyName("DynamicAssembly");
AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);
//动态创建模块
ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll");
//动态创建类MyClass
TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);
//动态创建字段
FieldBuilder fb = tb.DefineField("", typeof(System.String), FieldAttributes.Private);
//动态创建构造函数
Type[] clorType = new Type[] { typeof(System.String) };
ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);
//⽣成指令
ILGenerator ilg = cb1.GetILGenerator();//⽣成 Microsoft 中间语⾔ (MSIL) 指令
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
enum类型如何使用ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Stfld, fb);
ilg.Emit(OpCodes.Ret);
//动态创建属性
PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null);
//动态创建⽅法
MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;
MethodBuilder myMethod = tb.DefineMethod("get_Property", getSetAttr, typeof(string), Type.EmptyTypes);
//⽣成指令
ILGenerator numberGetIL = myMethod.GetILGenerator();
numberGetIL.Emit(OpCodes.Ldarg_0);
numberGetIL.Emit(OpCodes.Ldfld, fb);
numberGetIL.Emit(OpCodes.Ret);
//保存动态创建的程序集
dynamicAssembly.Save(DemoName.Name + ".dll");第⼆篇:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。