(论坛答疑点滴)一个动态编译的例子

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

using System;

using System.CodeDom.Compiler;

using Microsoft.CSharp;

using System.Reflection;

using System.Text;

namespace ConsoleApplication22

{

/// <summary>

/// Class1 的摘要说明。

/// </summary>

class Class1

{

/// <summary>

/// 应用程序的主入口点。

/// </summary>

[STAThread]

static void Main(string[] args)

{

//

// TODO: 在此处添加代码以启动应用程序

//

int i = (int)Calc("1+2*3");

Console.WriteLine(i.ToString());

Console.ReadLine();

}

public static object Calc(string expression)

{

string className = "Calc";

string methodName = "Run";

expression=expression.Replace("/","*1.0/");

// 创建编译器实例。

ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());

// 设置编译参数。

CompilerParameters paras = new CompilerParameters();

paras.GenerateExecutable = false;

paras.GenerateInMemory = true;

// 创建动态代码。

StringBuilder classSource = new StringBuilder();

classSource.Append("public class "+ className +"\n");

classSource.Append("{\n");

classSource.Append(" public object " + methodName + "()\n");

classSource.Append(" {\n");

classSource.Append(" return "+ expression + ";\n");

classSource.Append(" }\n");

classSource.Append("}");

//System.Diagnostics.Debug.WriteLine(classSource.ToString());

// 编译代码。

CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString());

// 获取编译后的程序集。

Assembly assembly = result.CompiledAssembly;

// 动态调用方法。

object eval = assembly.CreateInstance(className);

MethodInfo method = eval.GetType().GetMethod(methodName);

object reobj = method.Invoke(eval, null);

GC.Collect();

return reobj;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航