1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Test();
  6. }
  7.  
  8. public static void Test()
  9. {
  10. //声明代码的部分
  11. CodeCompileUnit compunit = new CodeCompileUnit();
  12. CodeNamespace sample = new CodeNamespace("命名空间");
  13. compunit.Namespaces.Add(sample);
  14.  
  15. //引用命名空间
  16. sample.Imports.Add(new CodeNamespaceImport("System"));//导入System命名空间
  17. sample.Imports.Add(new CodeNamespaceImport("System.Linq"));//导入System.Linq命名空间
  18.  
  19. //在命名空间下添加一个类
  20. CodeTypeDeclaration wrapProxyClass = new CodeTypeDeclaration("类名");
  21. //wrapProxyClass.BaseTypes.Add(baseType);// 如果需要的话 在这里声明继承关系 (基类 , 接口)
  22. wrapProxyClass.CustomAttributes.Add(new CodeAttributeDeclaration("Serializable"));//添加一个Attribute到class上
  23. sample.Types.Add(wrapProxyClass);//把这个类添加到命名空间 ,待会儿才会编译这个类
  24.  
  25. //为这个类添加一个无参构造函数 其实不添加也没事的, 只是做个demo而已
  26. CodeConstructor constructor = new CodeConstructor();
  27. constructor.Attributes = MemberAttributes.Public;
  28. wrapProxyClass.Members.Add(constructor);
  29.  
  30. //为这个类添加一个方法 public override int 方法名(string str);
  31. System.CodeDom.CodeMemberMethod method = new CodeMemberMethod();
  32. method.Name = "方法名";
  33. method.Attributes = MemberAttributes.Public;//声明方法是公开 并且override的
  34. method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "str")); //这个方法添加一个输入参数
  35. method.ReturnType = new CodeTypeReference(typeof(int));//声明返回值的类型
  36. method.Statements.Add(new CodeSnippetStatement(@"
  37. Console.WriteLine(str);
  38. return 1; ")); //方法体里面很简单 直接返回 一个1;
  39. wrapProxyClass.Members.Add(method);
  40.  
  41. CSharpCodeProvider cprovider = new CSharpCodeProvider();
  42.  
  43. ICodeGenerator gen = cprovider.CreateGenerator();
  44. StringBuilder fileContent = new StringBuilder();
  45. using (StringWriter sw = new StringWriter(fileContent))
  46. {
  47. gen.GenerateCodeFromCompileUnit(compunit, sw, new CodeGeneratorOptions());//想把生成的代码保存为cs文件
  48. }
  49.  
  50. ICodeCompiler compiler = cprovider.CreateCompiler();
  51.  
  52. //编译参数
  53. CompilerParameters cp = new CompilerParameters();
  54. cp.ReferencedAssemblies.Add("System.dll");//刚才引用了命名空间 这里是添加引用
  55. cp.ReferencedAssemblies.Add("System.Core.dll");//刚才引用了命名空间 这里是添加引用
  56.  
  57. cp.OutputAssembly = "输出dll的位置.dll";
  58. cp.GenerateInMemory = false; //是否只在内存中生成
  59. cp.IncludeDebugInformation = true;//包含调试符号 pdb文件
  60. cp.GenerateExecutable = false;//生成dll,不是exe
  61. cp.WarningLevel = ;
  62. cp.TreatWarningsAsErrors = false;
  63.  
  64. string filePath = "生成cs文件的保存位置.cs";
  65. File.WriteAllText(filePath, fileContent.ToString());
  66. CompilerResults cr = compiler.CompileAssemblyFromFile(cp, filePath); //保存文件再进行编译 待会儿调试就比较方便了 ,可以直接断点到刚才生成的文件里面
  67. // CompilerResults cr = compiler.CompileAssemblyFromDom(cp, compunit); //这样的生成 不用写文件 ,就是调试麻烦
  68. String outputMessage = "";
  69. foreach (var item in cr.Output)
  70. {
  71. outputMessage += item + Environment.NewLine;//调试的最终输出信息
  72. }
  73. if (cr.Errors.Count > )//有编译错误就抛出异常
  74. {
  75. throw new Exception("error:" + Environment.NewLine + outputMessage);
  76. }
  77.  
  78. string dllDir = Path.Combine(Directory.GetCurrentDirectory(), cp.OutputAssembly);
  79. Console.WriteLine(dllDir);
  80.  
  81. Assembly ass = Assembly.LoadFile(dllDir);
  82. Type t = ass.GetType("命名空间.类名");
  83. var obj = ass.CreateInstance("命名空间.类名");
  84. MethodInfo mi = t.GetMethod("方法名");
  85. mi.Invoke(obj, new object[] { "Hello _ World!" });
  86. }
  87. }

C#动态编程的更多相关文章

  1. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  2. Java动态编程初探——Javassist

    最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...

  3. 十七、C# 反射、特性和动态编程

    反射.特性和动态编程   1.访问元数据 2.成员调用 3.泛型上的反射 4.自定义特性 5.特性构造器 6.具名参数 7.预定义特性 8.动态编程   特性(attribute)是在一个程序集中插入 ...

  4. Java动态编程---动态代理

    java中动态编程用到的技术有:反射(动态代理),javassist和ASM,这几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成 ...

  5. [.NET] 《Effective C#》快速笔记 - C# 中的动态编程

    <Effective C#>快速笔记 - C# 中的动态编程 静态类型和动态类型各有所长,静态类型能够让编译器帮你找出更多的错误,因为编译器能够在编译时进行大部分的检查工作.C# 是一种静 ...

  6. C# 4动态编程新特性与DLR剖析

    =================================================== 注:很久没有发文了,贴一篇新文吧.从Word直接贴过来的,没仔细排版,诸位海涵.有关DLR和C# ...

  7. 动态编程(Dynamic Programming)

    本文素材来自视频,请自备梯子观看:What Is Dynamic Programming and How To Use It Dynamic Programming:动态编程分为如下几步: 将复杂问题 ...

  8. 使用javassist进行动态编程

    今天在研究dubbo时,发现一个新的知识点,可以使用javassist包进行动态编程,hibernate也使用该包进行编程.晚上百度了很多资料,将它的特性以代码的形式展现出来. package com ...

  9. 【java编程-Javassist】秒懂Java动态编程(Javassist研究)

    作者:ShuSheng007 来源:CSDN 原文:https://blog.csdn.net/ShuSheng0007/article/details/81269295 版权声明:本文为博主原创文章 ...

  10. C# 4.0中的动态类型和动态编程

    # 4.0的主题就是动态编程(Dynamic Programming).虽然C#仍然是一种静态语言,但是对象的意义开始变得越来越“动态”.它们的结构和行为无法通过静态类型来捕获,或者至少编译器在编译程 ...

随机推荐

  1. 使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: '127.0.0.1:59770', transport: 'socket'

    运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <gr ...

  2. Hibernate缓存配置

    一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口l ...

  3. c++内存对齐 转载

    转载自http://blog.csdn.net/chengonghao/article/details/51674166 例子举的特别好 很多文章大概都有像这样的结论: 1. 数据项只能存储在地址是数 ...

  4. HostingEnvironment RegisterObject和QueueBackgroundWorkItem

    其实网上关于HostingEnvironment 的RegisterObject和QueueBackgroundWorkItem文章已经很多了,典型是的 QueueBackgroundWorkItem ...

  5. JSON反序列化实体类

    1.定义实体类 [DataContract] public class CustomerWordOrderViewModel { [DataMember] public string Name; [D ...

  6. 【C#】Switch datatype between object and byte[]

    This sample shows how to turn object to byte[], as well as turn byte[] to object. So,I can turn any ...

  7. python 数据清洗之字符串处理

    在数据分析中,特别是文本分析中,字符处理需要耗费极大的精力, 因而了解字符处理对于数据分析而言,也是一项很重要的能力. 字符串处理方法 首先我们先了解下都有哪些基础方法 首先我们了解下字符串的拆分sp ...

  8. 【jQuery、原生】键盘键入两位小数

    jquery的处理办法 <!doctype html> <html lang="en"> <head> <meta charset=&qu ...

  9. 使用 FormsAuthentication 来进行登录验证

    1.在web.config文件中,<system.web>/<authentication>配置节用于对验证进行配置.为<authentication>节点提供mo ...

  10. ManualResetEvent和AutoResetEvent的区别

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...