using Microsoft.JScript;
int result=(int)GlobalObject.eval("2+2");
eval в С#
Вопрос прост. Как воспользоватся функцией eval из javascript или каким-то ее аналогом в С#. Просто нужно вычислить значение строки а нечем.
Цитата:
Originally posted by qad
Вопрос прост. Как воспользоватся функцией eval из javascript или каким-то ее аналогом в С#. Просто нужно вычислить значение строки а нечем.
Вопрос прост. Как воспользоватся функцией eval из javascript или каким-то ее аналогом в С#. Просто нужно вычислить значение строки а нечем.
1) Если заGooglится, то можно найти следующее:
http://www.valley.ru/~dmoiseev/evaluatorru.html
Исходник правда на C++, переправить на C# не сложно.
2) Можно использовать JScript. Ведь там он есть!
Код:
Можно ещё так:
using Microsoft.JScript;
using Microsoft.Vsa;
int result = (int) Eval.JScriptEvaluate("5+2", Vsa.VsaEngine.CreateEngine())
3) Другой выход заключается в том, чтобы заюзать CodeDOM, т.е. динамическу генерацию кода.
Код:
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
class Program
{
[STAThread]
static void Main(string[] args)
{
string e="2+sin(77/3.1415)/0.271";
Console.WriteLine("{0} = {1}", expression1, Evaluator(expression1));
}
static double Evaluator(string expression)
{
// компилятор кода C#
ICodeCompiler cs=(new CSharpCodeProvider().CreateCompiler());
// параметры компиляции: DLL в памяти
CompilerParameters cp=new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.GenerateExecutable =false; // создать DLL
cp.GenerateInMemory =true; // создать в памяти
// текст программы на C#:
string code=string.Empty;
code+="using System;";
code+="{ public class Evaluate";
code+=" { public double GetResult(){ return(\r\n"+expression+"\r\n); }";
code+=" private double sin(double x){ return(Math.Sin(x)); }";
code+=" private double cos(double x){ return(Math.Cos(x)); }";
code+=" }";
code+="}";
// компиляция исходного кода и получение сборки
CompilerResults cr=cs.CompileAssemblyFromSource(cp, code);
if(cr.Errors!=null && cr.Errors.Count>0) // ? ошибки
{ for(int i=0; i<cr.Errors.Count; i++)
Console.WriteLine("Col {0} - {1}", cr.Errors.Column, cr.Errors.ErrorText);
return(0.0);
}
try // создать объект и вызвать метод для вычисления выражения
{ object ob=cr.CompiledAssembly.CreateInstance("Evaluate");
return((double)ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[]{}));
}
catch(Exception ex){ Console.WriteLine(ex.Message); return(0.0); }
}
}
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
class Program
{
[STAThread]
static void Main(string[] args)
{
string e="2+sin(77/3.1415)/0.271";
Console.WriteLine("{0} = {1}", expression1, Evaluator(expression1));
}
static double Evaluator(string expression)
{
// компилятор кода C#
ICodeCompiler cs=(new CSharpCodeProvider().CreateCompiler());
// параметры компиляции: DLL в памяти
CompilerParameters cp=new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.GenerateExecutable =false; // создать DLL
cp.GenerateInMemory =true; // создать в памяти
// текст программы на C#:
string code=string.Empty;
code+="using System;";
code+="{ public class Evaluate";
code+=" { public double GetResult(){ return(\r\n"+expression+"\r\n); }";
code+=" private double sin(double x){ return(Math.Sin(x)); }";
code+=" private double cos(double x){ return(Math.Cos(x)); }";
code+=" }";
code+="}";
// компиляция исходного кода и получение сборки
CompilerResults cr=cs.CompileAssemblyFromSource(cp, code);
if(cr.Errors!=null && cr.Errors.Count>0) // ? ошибки
{ for(int i=0; i<cr.Errors.Count; i++)
Console.WriteLine("Col {0} - {1}", cr.Errors.Column, cr.Errors.ErrorText);
return(0.0);
}
try // создать объект и вызвать метод для вычисления выражения
{ object ob=cr.CompiledAssembly.CreateInstance("Evaluate");
return((double)ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[]{}));
}
catch(Exception ex){ Console.WriteLine(ex.Message); return(0.0); }
}
}
Если развить идею, то можно состряпать интерпретатор арифметич. выражений.
codeproject.com посмотреть
Ещё можешь на
Цитата:
Originally posted by 3A3-968M
Ещё можешь на codeproject.com посмотреть
Ещё можешь на codeproject.com посмотреть
Во втором случае я не могу вызывать Math методы. А при первом выскакивают exception "Eval may not be called via an alias".
Сделать аналогичный eval в C# не получится, т.к. приложения .NET не интерпретируются. Можно замутить через CodeDOM, в аттаче лежит примерчик. Пример позволяет использовать math функции sin и cos. Там же написано, как можно расширить для дургих функций.