public double Calculate(string formula, double x, double y)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false; //<--不生成exe
parameter.GenerateInMemory = true; //<--直接在内存运行
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
GenerateCodeBlocks(formula));
//动态编译(VisualStudio F5的时候也是做这个)
if (result.Errors.Count > 0)
{
MessageBox.Show("error");
}
//编译成功
double calculated = Convert.ToDouble(result.CompiledAssembly.GetType("demo.calculation").GetMethod("dowork").Invoke(null, new object[] { x, y }));
//这里通过反射调
return calculated;
}
string GenerateCodeBlocks(string formula)
{
string code =
"using System;" +
"namespace demo" +
"{" +
"public static class calculation" +
"{" +
"public static double dowork(double x, double y)" +
"{ return " + formula +
";}}}"; //这里是将你的formula和代码片段拼接成完整的程序准备编译的过程。
return code;
}
玩的开心 :)
ps 这动态编译代码我发了好几次了。。问题都差不多啊。。
formula那里带入你的s即可。
如果你还有更多参数可以修改下半部分的代码。
理解为:你动态编译一段C#给你算
首先 你写的是不对哦 字符串数据类型不能进行计算的 你可以这样写
double N=1,n=1;
double num1 = (36*N+2*n)*0.1 ;
string s= num1.ToString();//将小数型转换为字符串
//比如你使用了textBox控件 我们将计算的结果显示到这个控件中
this.textBox1.text = this.s;//将数据显示到控件上
public static int jishuan(int N,int n)
{
string s =convert.tostring((36*N+2*n)*0.1);
return s;
}
然后调用的时候 s = jisuan(2,3);//里面参数随便改 但是注意N 和n的顺序一定要对应
就是这个样子 注意有些单词的大小写 我没用编辑器 所以大小写不一定对
string s="(36*N+2*n)*0.1";这个是s字符串
把字符串内的字符全部转换类型
double temp=(convert.Todouble(36)*N+couvert.Todouble(2)*n))*counert.todouble(0.1);
你可以将字符串根据运算符号分解为子字符串,比如根据* ( ) + 等,将数据字符串转换为数字,然后就算即可吧,只是自己的一家之言。