using System;
using System.CodeDom.Compiler;
using Microsoft.VisualBasic;
using System.Reflection;
using System.Text;
public class FuncXYCodeDomHelper
{
Assembly assy;
object execInstance;
MethodInfo method;
object[] parameters;
public string expression;
public FuncXYCodeDomHelper(string exp)
{
expression = exp;
//Generate VB Code
StringBuilder sb = new StringBuilder();
//sb.Append("Imports System/r/n");
sb.Append("Imports System.Math/r/n");
sb.Append("Namespace RuntimeNamespace/r/n");
sb.Append("Class RuntimeClass/r/n");
sb.Append("Public Function f(ByVal x As Double, ByVal y As Double) As Double/r/n");
sb.Append("Return " + this.expression + "/r/n");
sb.Append("End Function/r/n");
sb.Append("End Class/r/n");
sb.Append("End Namespace/r/n");
//Prepare CodeDom
VBCodeProvider cp = new VBCodeProvider();
CompilerParameters cparams = new CompilerParameters();
cparams.GenerateInMemory = true;
CompilerResults cresults = cp.CompileAssemblyFromSource(cparams, sb.ToString());
sb=null;
if(cresults.Errors.Count>0)
{
throw new Exception("Compile error count : " + cresults.Errors.Count.ToString());
}
else
{
assy = cresults.CompiledAssembly;
execInstance = assy.CreateInstance("RuntimeNamespace.RuntimeClass");
Type t = execInstance.GetType();
method = t.GetMethod("f");
parameters = new object[2];
}
}
~FuncXYCodeDomHelper()
{
method = null;
parameters = null;
execInstance = null;
assy = null;
}
public double func(double x, double y)
{
parameters[0]=x;
parameters[1]=y;
return (double)method.Invoke(execInstance, parameters);
}
}
using System.CodeDom.Compiler;
using Microsoft.VisualBasic;
using System.Reflection;
using System.Text;
public class FuncXYCodeDomHelper
{
Assembly assy;
object execInstance;
MethodInfo method;
object[] parameters;
public string expression;
public FuncXYCodeDomHelper(string exp)
{
expression = exp;
//Generate VB Code
StringBuilder sb = new StringBuilder();
//sb.Append("Imports System/r/n");
sb.Append("Imports System.Math/r/n");
sb.Append("Namespace RuntimeNamespace/r/n");
sb.Append("Class RuntimeClass/r/n");
sb.Append("Public Function f(ByVal x As Double, ByVal y As Double) As Double/r/n");
sb.Append("Return " + this.expression + "/r/n");
sb.Append("End Function/r/n");
sb.Append("End Class/r/n");
sb.Append("End Namespace/r/n");
//Prepare CodeDom
VBCodeProvider cp = new VBCodeProvider();
CompilerParameters cparams = new CompilerParameters();
cparams.GenerateInMemory = true;
CompilerResults cresults = cp.CompileAssemblyFromSource(cparams, sb.ToString());
sb=null;
if(cresults.Errors.Count>0)
{
throw new Exception("Compile error count : " + cresults.Errors.Count.ToString());
}
else
{
assy = cresults.CompiledAssembly;
execInstance = assy.CreateInstance("RuntimeNamespace.RuntimeClass");
Type t = execInstance.GetType();
method = t.GetMethod("f");
parameters = new object[2];
}
}
~FuncXYCodeDomHelper()
{
method = null;
parameters = null;
execInstance = null;
assy = null;
}
public double func(double x, double y)
{
parameters[0]=x;
parameters[1]=y;
return (double)method.Invoke(execInstance, parameters);
}
}
本文介绍了一种使用CodeDom在运行时动态编译数学表达式的实现方法。通过Visual Basic Code Provider,将字符串形式的数学表达式编译为可执行代码,并提供了一个具体的类`FuncXYCodeDomHelper`来演示整个过程。
1993

被折叠的 条评论
为什么被折叠?



