Здравствуйте, zoom-zoom, Вы писали:
ZZ>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?
Строку можно скомпилировать и запускать используя CodeDom. Без учета времени компиляции (например, используя пре-компилицию формул) вызов должен быть быстрее.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, zoom-zoom, Вы писали:
ZZ>>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?
N>Можно так:
N>
Здравствуйте, Sinatr, Вы писали:
S>Здравствуйте, zoom-zoom, Вы писали:
ZZ>>Может кто сталкивался, есть ли альтернативы более надежные и более быстрые?
S>Строку можно скомпилировать и запускать используя CodeDom. Без учета времени компиляции (например, используя пре-компилицию формул) вызов должен быть быстрее.
Написал так:
static object 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 += "namespace CSEvaluator";
code += "{ public class Evaluate";
code += " { public double GetResult(){ return(\r\n" + expression + "\r\n); }";
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++)
// //Report(cr.Errors[i].Column + cr.Errors[i].ErrorText);
// Console.WriteLine("Col {0} - {1}", cr.Errors[i].Column, cr.Errors[i].ErrorText);return (0.0);
}
try// создать объект и вызвать метод для вычисления выражения
{
object ob = cr.CompiledAssembly.CreateInstance("CSEvaluator.Evaluate");
return (ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[] { }));
}
catch
{
///Report(ex.Message.ToString()); return (0.0);
}
}
var Result = Evaluator(expression); \\вызов
Считает очень долго, плюс не потокобезопасный, как и JScriptEvaluate, а хотелось бы расчеты делать параллельные. Пре-компилицию пока не разобрался, как сделать.
ClearScript is a library that makes it easy to add scripting to your .NET applications. It currently supports JavaScript (via V8 and JScript) and VBScript. http://clearscript.codeplex.com/