質問
いのと同等のもの
object result = Eval("1 + 3");
string now = Eval("System.DateTime.Now().ToString()") as string
以下のんびりs リンク, で、私はこのスニペットを修正削除廃止方法 ICodeCompiler.CreateCompiler()
:
private object Eval(string sExpression)
{
CSharpCodeProvider c = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
StringBuilder sb = new StringBuilder("");
sb.Append("using System;\n");
sb.Append("namespace CSCodeEvaler{ \n");
sb.Append("public class CSCodeEvaler{ \n");
sb.Append("public object EvalCode(){\n");
sb.Append("return " + sExpression + "; \n");
sb.Append("} \n");
sb.Append("} \n");
sb.Append("}\n");
CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());
if (cr.Errors.Count > 0)
{
throw new InvalidExpressionException(
string.Format("Error ({0}) evaluating: {1}",
cr.Errors[0].ErrorText, sExpression));
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
他のヒント
まっているオープンソースプロジェクト 動辺, らではの変換テキスト表現を使って、書きC#で書式への代表者又は表現。テキスト表現を構文解析および変換 表現の木 を使用せずに作成または反射を生み出します。
きのようなもの:
var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");
または
var interpreter = new Interpreter()
.SetVariable("service", new ServiceExample());
string expression = "x > 4 ? service.aMethod() : service.AnotherMethod()";
Lambda parsedExpression = interpreter.Parse(expression,
new Parameter("x", typeof(int)));
parsedExpression.Invoke(5);
私の仕事はスコット-グ記事 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .
古い課題でしたが、このスレッドを示すがgoogling、こちらが更新されます。
利用できる Roslynの新しいスクリプティングAPIの評価表現.
ご利用の場合NuGet能への依存性 Microsoft.CodeAnalysis.圧倒的な支持を得.スクリプティング.評価の事例お客様よりご提供いただいたのでしています:
var result = CSharpScript.EvaluateAsync("1 + 3").Result;
この明らかな利用のスクリプティングエンジンの非力です。
を指定することもできますの評価結果タイプに用いてください:
var now = CSharpScript.EvaluateAsync<string>("System.DateTime.Now.ToString()").Result;
評価より高度なコードスニペット、パラメータを参照の名前空間とwhatnotのwikiリンクです。
場合は具体的にはいたくコードやアセンブリ自分のプロジェクトで私が提唱に C#CodeDom CodeProvider.
これまでで最も人気のアプローチを知っ評価のための文字列表現を動的にクライアントまで、フルのC#.
Microsoft解
- C#CodeDom CodeProvider:
- Roslyn:
- この 記事Rosly放API この StackOverflowの回答
- DataTable.計算:
- ブラウザ.書きします。InvokeScript
- DataBinder.<エバール>
- ScriptControl
- 実行中のユー:
非Microsoftソリューション(ませんが何か間違っていること)
- 式評価書
- ロール自分の言葉ビルのツールキットのように:
using System;
using Microsoft.JScript;
using Microsoft.JScript.Vsa;
using Convert = Microsoft.JScript.Convert;
namespace System
{
public class MathEvaluator : INeedEngine
{
private VsaEngine vsaEngine;
public virtual String Evaluate(string expr)
{
var engine = (INeedEngine)this;
var result = Eval.JScriptEvaluate(expr, engine.GetEngine());
return Convert.ToString(result, true);
}
VsaEngine INeedEngine.GetEngine()
{
vsaEngine = vsaEngine ?? VsaEngine.CreateEngineWithType(this.GetType().TypeHandle);
return vsaEngine;
}
void INeedEngine.SetEngine(VsaEngine engine)
{
vsaEngine = engine;
}
}
}
その性能に影響?
また使用に基づくシステムのようなものの上に、それぞれのC#のスクリプトが作成されるメモリ内の組み立て、実行が別AppDomain.あのキャッシングシステムなので、スクリプトの再コンパイル時にいます。もちろん、一部簡易試験およびシンプルな"こんにちは世界の"スクリプトを編集で約0.7秒私の機械を含む搭載のスクリプトからディスク。0.7秒であるスクリプティングシステムが遅すぎる対応のためのユーザー入力、その場合は専用のパーサ/コンパイラのような避難の方が良いかもしれない。
using System;
public class Test
{
static public void DoStuff( Scripting.IJob Job)
{
Console.WriteLine( "Heps" );
}
}
うもあり、その利用の正規表現とXPathNavigatorを評価する。はなかったので試験しながっているうちに気に入ってくれているいないので、要するにコンパイルコード実行時にはライブラリを使用できない可能です。
http://www.webtips.co.in/c/evaluate-function-in-c-net-as-eval-function-in-javascript.aspx
私だい場合は翌々日以降の発送にあります。私も考えてみでトであることを明らかにし、私はほとんど眠っていいます。
がC#な支援のためのエバール方法をネイティブ、C#<エバール>プログラムとはでき評価のためのC#コードです。で評価のためのC#コードで実行時の支援を多くのC#で記述です。実際、このコード内で使用可能。ネプロジェクトからはC#構文です。て差し替えによって、様々なサイト http://csharp-eval.com, は、追加ます。