网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

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信息也是模块的一部分。多个模块组建成一个程序集。

所谓动态就是在程序运行时,动态的创建和使用。

直接看代码吧,其实超级简单。

  1. //动态创建程序集 
  2. AssemblyName DemoName = new AssemblyName("DynamicAssembly"); 
  3. AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave); 
  4. //动态创建模块 
  5. ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll"); 
  6. //动态创建类MyClass 
  7. TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public); 
  8. //动态创建字段 
  9. FieldBuilder fb = tb.DefineField(""typeof(System.String), FieldAttributes.Private);   
  10. //动态创建构造函数 
  11. Type clorType = new Type { typeof(System.String) }; 
  12. ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType); 
  13. //生成指令 
  14. ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令 
  15. ilg.Emit(OpCodes.Ldarg_0); 
  16. ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); 
  17. ilg.Emit(OpCodes.Ldarg_0); 
  18. ilg.Emit(OpCodes.Ldarg_1); 
  19. ilg.Emit(OpCodes.Stfld, fb); 
  20. ilg.Emit(OpCodes.Ret); 
  21. //动态创建属性 
  22. PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null); 
  23. //动态创建方法 
  24. MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName; 
  25. MethodBuilder myMethod = tb.DefineMethod("get_Property", getSetAttr, typeof(string), Type.EmptyTypes); 
  26. //生成指令 
  27. ILGenerator numberGetIL = myMethod.GetILGenerator(); 
  28. numberGetIL.Emit(OpCodes.Ldarg_0); 
  29. numberGetIL.Emit(OpCodes.Ldfld, fb); 
  30. numberGetIL.Emit(OpCodes.Ret); 
  31. //保存动态创建的程序集 
  32. dynamicAssembly.Save(DemoName.Name + ".dll"); 
  • 上一篇资讯: AJAX,JSON与MVC
  • 下一篇资讯: CodeSmith的使用
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师