快捷搜索:

C#动态创建和动态使用程序集、类、方法、字段等

无意偶尔候在全部项目架构里也必要动态创建法度榜样集的需求,那若何创建法度榜样集呢,请跟我来进修一下吧。

首先必要知道动态创建这些类型是应用的一些什么技巧呢?着实只要相关动态加载法度榜样集呀,类呀,都是应用反射,那么动态创建也一样应用的是反射,是属于反射的技巧!也便是将工具或者数据映射成一个工具或者法度榜样集保存起来而已。

首先我们必要懂得每个动态类型在.net中都是用什么类型来表示的。

法度榜样集: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));

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

您可能还会对下面的文章感兴趣: