Mono.CSharpの最新ビルドに出くわし、それが提供する約束を気に入っています。
次のすべてを解決することができました:
namespace XAct.Spikes.Duo
{
class Program
{
static void Main(string[] args)
{
CompilerSettings compilerSettings = new CompilerSettings();
compilerSettings.LoadDefaultReferences = true;
Report report = new Report(new Mono.CSharp.ConsoleReportPrinter());
Mono.CSharp.Evaluator e;
e= new Evaluator(compilerSettings, report);
//IMPORTANT:This has to be put before you include references to any assemblies
//our you;ll get a stream of errors:
e.Run("using System;");
//IMPORTANT:You have to reference the assemblies your code references...
//...including this one:
e.Run("using XAct.Spikes.Duo;");
//Go crazy -- although that takes time:
//foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
//{
// e.ReferenceAssembly(assembly);
//}
//More appropriate in most cases:
e.ReferenceAssembly((typeof(A).Assembly));
//Exception due to no semicolon
//e.Run("var a = 1+3");
//Doesn't set anything:
//e.Run("a = 1+3;");
//Works:
//e.ReferenceAssembly(typeof(A).Assembly);
e.Run("var a = 1+3;");
e.Run("A x = new A{Name=\"Joe\"};");
var a = e.Evaluate("a;");
var x = e.Evaluate("x;");
//Not extremely useful:
string check = e.GetVars();
//Note that you have to type it:
Console.WriteLine(((A) x).Name);
e = new Evaluator(compilerSettings, report);
var b = e.Evaluate("a;");
}
}
public class A
{
public string Name { get; set; }
}
}
そして、それは楽しかったです...スクリプトのスコープに変数を作成し、値をエクスポートすることができます。
最後に理解すべきことが1つあります...静的なもの(Webアプリでこれを使用することを考えている)を使用せずに、(たとえば、ルールスクリプトを適用するドメインエンティティ)で値を取得するにはどうすればよいですか? ?
コンパイルされたデリゲートの使用を見てきましたが、それは以前のバージョンのMono.CSharpの場合であり、もはや機能していないようです。
誰かが現在のバージョンでこれを行う方法についての提案がありますか?
どうもありがとう。
参照:*変数をMono.CSharp.Evaluatorに挿入します(文字列からLINQクエリをコンパイルするランタイム) * http://naveensrinivasan.com/tag/mono/