日期:2014-05-17 浏览次数:21182 次
using System; using System.Data; using System.Configuration; using System.Text; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; namespace InspectDocument.Utils { /// <summary> /// 本类用来将字符串转为可执行文本并执行 /// </summary> public class EvaluatorUtil { #region 构造函数 /// <summary> /// 可执行串的构造函数 /// </summary> /// <param name="items"> /// 可执行字符串数组 /// </param> public EvaluatorUtil(EvaluatorItem[] items) { ConstructEvaluator(items); //调用解析字符串构造函数进行解析 } /// <summary> /// 可执行串的构造函数 /// </summary> /// <param name="returnType">返回值类型</param> /// <param name="expression">执行表达式</param> /// <param name="name">执行字符串名称</param> public EvaluatorUtil(Type returnType, string expression, string name) { //创建可执行字符串数组 EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) }; ConstructEvaluator(items); //调用解析字符串构造函数进行解析 } /// <summary> /// 可执行串的构造函数 /// </summary> /// <param name="item">可执行字符串项</param> public EvaluatorUtil(EvaluatorItem item) { EvaluatorItem[] items = { item };//将可执行字符串项转为可执行字符串项数组 ConstructEvaluator(items); //调用解析字符串构造函数进行解析 } /// <summary> /// 解析字符串构造函数 /// </summary> /// <param name="items">待解析字符串数组</param> private void ConstructEvaluator(EvaluatorItem[] items) { //创建C#编译器实例 CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); //过时了 //ICodeCompiler comp = provider.CreateCompiler(); //编译器的传入参数 CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("system.dll"); //添加程序集 system.dll 的引用 cp.ReferencedAssemblies.Add("system.data.dll"); //添加程序集 system.data.dll 的引用 cp.ReferencedAssemblies.Add("system.xml.dll"); //添加程序集 system.xml.dll 的引用 cp.GenerateExecutable = false; //不生成可执行文件 cp.GenerateInMemory = true; //在内存中运行 StringBuilder code = new StringBuilder(); //创建代码串 /* * 添加常见且必须的引用字符串 */ code.Append("using System;"); code.Append("namespace InspectDocument.Utils.Math {"); //生成代码的命名空间为EvalGuy,和本代码一样 code.Append(" public class _Evaluator {"); //产生 _Evaluator 类,所有可执行代码均在此类中运行 foreach (EvaluatorItem item in items) //遍历每一个可执行字符串项 { code.AppendFormat(" public {0} {1}() ", //添加定义公共函数代码 item.ReturnType.Name, //函数返回值为可执行字符串项中定义的返回值类型 item.Name); //函数名称为可执行字符串项中定义的执行字符串名称 code.Append("{ "); //添加函数开始括号 code.AppendFormat("return ({0});", item.Expression);//添加函数体,返回可执行字符串项中定义的表达式的值 code.Append("}"); //添加函数结束括号 } code.Append("} }"); //添加类结束和命名空间结束括号 //得到编译器实例的返回结果 CompilerResults cr = provider.CompileAssemblyFromSource(cp, code.