博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET中的动态编译
阅读量:5965 次
发布时间:2019-06-19

本文共 3764 字,大约阅读时间需要 12 分钟。

http://www.cnblogs.com/zlgcool/archive/2008/10/12/1309616.html

 

在开始之前,先熟悉几个类及部分属性、方法:、、、、。

  一、CSharpCodeProvider
    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用。
    CreateCompiler():获取编译器的实例。
  二、ICodeCompiler
    定义用于调用源代码编译的接口或使用指定编译器的树。每种编译方法都接受指示编译器的对象,并返回指示编译结果的对象。
    CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。
  三、CompilerParameters
    表示用于调用编译器的参数。
    ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
    GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
    GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。
  四、CompilerResults
    表示从编译器返回的编译结果。
    CompiledAssembly:获取或设置以编译的程序集,Assembly类型。
  五、Assembly
    就是程序集了(不知道如何描述了)。
  大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:

 

1 using System;  2 using System.Reflection;  3 using System.Globalization;  4 using Microsoft.CSharp; 5 using System.CodeDom;  6 using System.CodeDom.Compiler; 7 using System.Text;  8  9 namespace ConsoleApplication1 10 {11     public class Program12     {13         static void Main(string[] args)14         {15             // 1.CSharpCodePrivoder16             CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();17 18             // 2.ICodeComplier19             ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();20 21             // 3.CompilerParameters22             CompilerParameters objCompilerParameters = new CompilerParameters();23             objCompilerParameters.ReferencedAssemblies.Add("System.dll");24             objCompilerParameters.GenerateExecutable = false;25             objCompilerParameters.GenerateInMemory = true;26 27             // 4.CompilerResults28             CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());29 30             if (cr.Errors.HasErrors)31             {32                 Console.WriteLine("编译错误:");33                 foreach (CompilerError err in cr.Errors)34                 {35                     Console.WriteLine(err.ErrorText);36                 }37             }38             else39             {40                 // 通过反射,调用HelloWorld的实例41                 Assembly objAssembly = cr.CompiledAssembly;42                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");43                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");44 45                 Console.WriteLine(objMI.Invoke(objHelloWorld, null));46             }47 48             Console.ReadLine();49         }50 51         static string GenerateCode()52         {53             StringBuilder sb = new StringBuilder();54             sb.Append("using System;");55             sb.Append(Environment.NewLine);56             sb.Append("namespace DynamicCodeGenerate");57             sb.Append(Environment.NewLine);58             sb.Append("{
");59 sb.Append(Environment.NewLine);60 sb.Append(" public class HelloWorld");61 sb.Append(Environment.NewLine);62 sb.Append(" {
");63 sb.Append(Environment.NewLine);64 sb.Append(" public string OutPut()");65 sb.Append(Environment.NewLine);66 sb.Append(" {
");67 sb.Append(Environment.NewLine);68 sb.Append(" return \"Hello world!\";");69 sb.Append(Environment.NewLine);70 sb.Append(" }");71 sb.Append(Environment.NewLine);72 sb.Append(" }");73 sb.Append(Environment.NewLine);74 sb.Append("}");75 76 string code = sb.ToString();77 Console.WriteLine(code);78 Console.WriteLine();79 80 return code;81 }82 }83 }

 

你可能感兴趣的文章
部署WEB项目到服务器(二)安装tomcat到linux服务器(Ubuntu)详解
查看>>
SpringBoot之SpringBoot+Mybatis+Mysql+Maven整合
查看>>
SQLServer BI 学习笔记
查看>>
20160504-hibernate入门
查看>>
工作四周年
查看>>
sql定时自动备份(定时作业)
查看>>
Excel 2013 表格自用技巧
查看>>
ubuntu安装VNC、Xfce桌面
查看>>
浅析支付系统的整体架构
查看>>
二位数组
查看>>
unix文件权限
查看>>
Python 模拟鼠键
查看>>
2017-2018-2 20155224『网络对抗技术』Exp7:网络欺诈防范
查看>>
tomcat 搭建
查看>>
Source Code Review
查看>>
分享一下我安装启动Jmeter出错时的解决办法
查看>>
java 调用process
查看>>
用a标签实现submit提交按钮的效果
查看>>
第十周
查看>>
毕向东_Java基础视频教程第20天_IO流(1~4)
查看>>