初探IronJS

9758 ワード

ところで、最近は特別なニーズがあり、C#で動的な言語を呼び出してよく変更される操作を実行する必要があります.私はLuaに夢中なので、最初からそれを思い出して、LuaInterfaceを理解して、問題が多いようです(issue listには解決していないdefectがたくさんあります)、しかも今とても怒っているDLRとは関係ないようです.
MSがサポートしているIron系言語は牛のように見えますが、PythonもRubyも触れたことがなく、最近新しい言語を学ぶ時間もありません.IronLuaを検索すると、Googleにはプロジェクトがあるのにコードがありません.私はよくJSでWSHのシナリオを书いているので(CMDが腐っている)、JSに详しいので、IronJSはこのように私に见つかりました!!
IronJS機能は非常に牛ですが、ドキュメントは確かに少なく、プロジェクトwikiblogを除いては少し、基本的には見つけにくく、中国語はもっと少ないです.試したばかりで、いい感じで、記録して、レンガを投げて玉を引いて、みんなの興味を引き起こすことができることを望んでいます.
準備作業
githubからコンパイルしたdllをダウンロードするか、ソースコードをダウンロードしてコンパイルし、IronJSを得る.dll、参照を追加します.
Hello IronJS
1         static void Main(string[] args)

2         {

3             var ctx = new IronJS.Hosting.CSharp.Context();

4             dynamic hello = ctx.Execute("(function (){ return {msg:'  ,IronJS'};})();");

5             Console.Out.WriteLine(hello.msg);

6             Console.Out.WriteLine(hello.noexist);

7             Console.ReadKey(true);

8         }

このコードは一目でわかるように、まずjsが実行するcontextを新規作成し、その後jsの関数を実行し、このjsの関数はobjectを返し、msg属性を含む、利用する.NET 4.0のdynamicキーワードは、メンバーを簡単に参照できます.また、存在しないメンバーを参照するとundefinedが返され、期待に合っていることもわかります.
Access C# object
 1         class User

 2         {

 3             public string Name { get; set; }

 4         }

 5 

 6         static void Main(string[] args)

 7         {

 8             var ctx = new IronJS.Hosting.CSharp.Context();

 9             var user = new User() { Name = "  " };

10             ctx.SetGlobal("user", user);

11             ctx.CreatePrintFunction();

12             ctx.Execute(@"

13                     print(user.Name);

14                     print(user.noexist);

15                     print(typeof user.nodef == 'undefined' ? 'Yes' : 'No')");

16             Console.ReadKey(true);

17         }

10行目はuser変数をjsのグローバル変数に設定し、11行目はjs環境でprint関数を作成し、jsでuserオブジェクト属性にアクセスし、存在しない属性にアクセスしたときに返されるundefinedは、完全に所望に合致する.
JSON
 1 static void Main(string[] args)

 2         {

 3             var ctx = new IronJS.Hosting.CSharp.Context();

 4             var json = @"

 5                var configs = { 

 6                     location:{x:0, y:0}, 

 7                     size:{cx:100, cy:200},

 8                     color:'red'

 9                 };";

10 

11             var configs = ctx.Execute(json);

12 

13             Console.Out.WriteLine("x={0},y={1},cx={2},cy={3},color={4}",

14                 configs.location.x,

15                 configs.location.y,

16                 configs.size.cx,

17                 configs.size.cy,

18                 configs.color);

19 

20             Console.ReadKey(true);

21         }

こんなに簡単です!ユーザープログラムにプロファイルが必要な場合、XMLを丸める必要は全くありません.LINQ to XMLでも簡単ですが、直接読むまで簡単に実行できますか.
Regular Expression
2年前にIronJSが正規表現をサポートしていなかったというので、わざわざ試してみましたが、今は本当にサポートしています!
1         static void Main(string[] args)

2         {

3             var ctx = new IronJS.Hosting.CSharp.Context();

4             ctx.Execute(@"var re = /(\d+)-(\d+)-(\d+)/;");

5             dynamic result = ctx.Execute(@"re.exec('2012-11-29');");            

6             Console.Out.WriteLine("{0} {1} {2} ", result[1], result[2], result[3]);

7             Console.ReadKey(true);

8         }

寝て、面接のいくつかの点は基本的に私のプロファイル全体を満たすことができて、それから1つのjs文を埋め込むテンプレートに基づいて1つのCファイルの需要を生成します.暇があればもっと機能を検討しましょう.