40

.NET CLR/DLRを対象とする ECMAScript の実際の(つまり、ベーパーウェアではない) 実装を知っている人はいますか? 理想的には Rhino for Java のようなものです。.NET Framework / Mono Framework で動作する Rhino の確実な移植は完璧です。

言及されたプロジェクトはほんの一握りしか見たことがありませんが、実際にスクリプトを実行できたプロジェクトは見たことがありません。これが私がすでに知っていることです:

  • MSScriptControl ActiveX コントロール: 私の知る限り、これは Microsoft の最後の実際の ECMAScript 準拠の実装 (JScript 5.7 を実行) でした。私は MSScriptControl と統合しましたが、COM 相互運用がこの質問に対する答えになるとは考えていません。x64 は、このオプションのキラーです。

  • JScript.NET : JScript.NET は、実際のスクリプトを正常に解析できなかったため、数えません。閉鎖に問題があるようです。

  • マネージ JScript : 私が望むもののように聞こえますが、水中で死んでいるように見えます。これは DLR の主要な実装例でしたが、その後 SilverLight と絡み合い、2007 年以降は優先順位が薄れているようです。これに関する信頼できる情報源が役立ちます。

  • MyJScript : DLR のチュートリアル実装として構築されています。これがどれほど完全な実装か知っている人はいますか?

  • Jint : .NET 用の JavaScript インタープリター。現在のところ、カリー化または- -をサポートしていません。trycatchfinally

  • RemObjects Script for .NET : 興味深い候補がまだ開発中です。それが実際にどうなるかについては、彼らのマーケティングに混乱していますが、最終的には適合するように思えます. 誰かがそれについてもっと知っていれば、それも役に立ちます。

  • V8 for .NET : 誰かが V8 を .NET に移植した場合、これは素晴らしいことです。私の知る限り、これについても大きな努力はありません。このリンクは、マネージ C++ ラッパーから呼び出すためのアイデアへのリンクです。

背景として、.NET 内から JavaScript を実行できるようにしたいと考えています。つまり、一連のスクリプトをコンテキストにロードし、そのコンテキストを呼び出して、実行結果を取得します。現在、面倒な COM 相互運用機能を介して MSScriptControl を使用するためにフープをジャンプしています。COM には一貫性がないため、デプロイと一貫した実行の確保が非常に難しくなっています。

かなり複雑な JavaScript テスト ハーネスを .NET 内から実行できるようにしたいと考えています。これは、ユーザー マクロや単純な小さなスクリプトを作成するためのものではありません。Rhino のような実際の JavaScript 環境が必要です。実装が (COM ではなく) CLR の上で実行されている場合、これは現在の問題のいくつかを解決するのに非常に役立ちます。

4

9 に答える 9

18

現在、YUICompressor.NETポート (プロジェクト)内のEcmaScript.NETのバージョンを変更しました。

ここからソース コードを取得すると、変更したコードがプロジェクトに含まれているので、参照することができます。これは、サーバー側で JavaScript の解析を処理できる .NET で見つけたコードの唯一のソースです。

残念ながら、どうやって見つけたのか思い出せません。認めざるを得ない大変なプロセスでした。Rhino (Java コード) に関する Mozilla 開発ページの参照をどこかで見つけたので、C# .NET の実装を見つけるに至りました。

YUI Compressor の担当者がコード ブランチに対して行ったいくつかの変更と同期させるために、少し変更する必要がありました。したがって、私が持っている変更されたブランチは最高ではないかもしれません..しかし、それは私が見た中で元のJavaブランチに最も近いものです.

EcmaScript.NET の元の c# コードは 2007 年以来変更されていません (少なくともダウンロード ページについては)。

ひょっとしたらこれが役に立つかも??

HTH。

于 2009-07-03T00:28:28.803 に答える
14

まだ大まかに生きている:

  • ジュラ紀(昨年中にコミットしました。)
  • Jint(現在プルリクエストを受け付けています。)

他のプロジェクト、ほとんど死んでいる:

クレイジーメソッド:

  • Rhino over IKVM(コメントで言及されていますが、これを行うための詳細情報へのリンクがあります。)
于 2010-03-05T01:45:03.530 に答える
12

誰もjurassicについて言及していませんhttp://jurassic.codeplex.com/ 一般的に(パフォーマンス、使いやすさなど)どれだけ優れているかはわかりませんが、少なくともかなり複雑なスクリプトを解析し(他の実装では解析しません)、ECMAScript 5をサポートしています仕様 参照用にここにリンクを追加します。

于 2011-04-21T15:58:06.480 に答える
8

ClearScript について誰も言及していないので、ClearScript .

これは実装ではありません。これは、V8、JScript、および VBScript をサポートする相互運用ラッパーであり、.NET コードからそれらを呼び出すための非常に優れた API を備えています。

CodePlex ページのコード例:

using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

// create a script engine
using (var engine = new V8ScriptEngine())
{
    // expose a host type
    engine.AddHostType("Console", typeof(Console));
    engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");

    // expose a host object
    engine.AddHostObject("random", new Random());
    engine.Execute("Console.WriteLine(random.NextDouble())");

    // expose entire assemblies
    engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
    engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

    // create a host object from script
    engine.Execute(@"
        birthday = new lib.System.DateTime(2007, 5, 22);
        Console.WriteLine(birthday.ToLongDateString());
    ");

    // use a generic class from script
    engine.Execute(@"
        Dictionary = lib.System.Collections.Generic.Dictionary;
        dict = new Dictionary(lib.System.String, lib.System.Int32);
        dict.Add('foo', 123);
    ");

    // call a host method with an output parameter
    engine.AddHostObject("host", new HostFunctions());
    engine.Execute(@"
        intVar = host.newVar(lib.System.Int32);
        found = dict.TryGetValue('foo', intVar.out);
        Console.WriteLine('{0} {1}', found, intVar);
    ");

    // create and populate a host array
    engine.Execute(@"
        numbers = host.newArr(lib.System.Int32, 20);
        for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
        Console.WriteLine(lib.System.String.Join(', ', numbers));
    ");

    // create a script delegate
    engine.Execute(@"
        Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
        oddFilter = new Filter(function(value) {
            return (value & 1) ? true : false;
        });
    ");

    // use LINQ from script
    engine.Execute(@"
        oddNumbers = numbers.Where(oddFilter);
        Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
    ");

    // call a script function
    engine.Execute("function print(x) { Console.WriteLine(x); }");
    engine.Script.print(DateTime.Now.DayOfWeek);

    // examine a script object
    engine.Execute("person = { name: 'Fred', age: 5 }");
    Console.WriteLine(engine.Script.person.name);
}
于 2013-09-20T11:35:56.403 に答える
7

オープンソースの ECMAScript インタープリターである Jint ( http://jint.codeplex.com ) を見ることができます。

アップデート

https://github.com/sebastienros/jintの Github で利用可能な新しく書き直されたバージョン

于 2009-10-26T12:59:55.567 に答える
6

Codeplex でJavascript .NET ( http://javascriptdotnet.codeplex.com/ ) を試す必要があります。v8 をマネージ C++ でラップすると、このライブラリを .NET アプリケーションで使用できるようになり、魅力的に機能します。あなたが私に尋ねるならば、オープンソースはいくつかのかなり良い機能を提供します.

乾杯。

于 2010-08-25T02:47:04.890 に答える
4

Jscript.net を使用することができ、実際には任意の JavaScript コードで動作します。でコンパイルして「高速モード」をオフにするだけですjsc /fast- bar.js

これはテストしていません。この投稿を読んでいるときに気づいたのですが、それが別の合理的な解決策になると考えました. MSDN には、このオプションのドキュメントと、使用しない場合の制限事項があります。

于 2011-06-22T21:36:29.967 に答える
1

私は他のものよりもJINTを好みます。

JINT は遅いかもしれませんが、デバッグや独自の .NET クラスとのやり取りは簡単です。[ComVisile]( jscript.dll などで毎回属性を設定するのは大変です)。

スレッドに関しては、JINT と Jurassic は期待どおりに動作します。JScript エンジンまたは Google V8 を使用するには、UI スレッドの問題に注意する必要があります。

ただし、JQuery 1.5以降をコンパイルするのに問題があるため、JINTはいくつかの面で時代遅れです。

ジュラシックが独自のクラスを作成することで動作するように制限を取り除くことができることを願ってい'AllowBob'sCLRClass=true'ます。

クラス全体を書き直さなければなりません。それは難しい...

于 2012-11-15T19:31:46.027 に答える