4

DLRを使用してc#からjavascriptコードを実行したい。

c#だから私はとJintを使って簡単なコードを書きました:

  var script = @"
                               function show( )
                               {
                                      return  parseInt('123asd'); //in js it's 123
                               };
                               return show();";

                var result = new JintEngine().Run(script);
                Console.WriteLine(result);

parseInt('123asd')javascriptでは:123

しかし、私が得る結果は次のとおりです。

ここに画像の説明を入力してください

  • 全体像がわからないかもしれませんが、世界の反対側にいるプログラマーがスクリプトファイルを送ってくれた場合、私(および彼)は結果が一貫していることを期待しています。

  • 間違えた場合、.Netで他のコードを実行するのにどのようなシナリオを使用しますか?(コードのすべての行について非常に疑わしい必要があります...)

4

2 に答える 2

4

これは、JintのpartseInt機能の現在の動作のようです。

関連コード:

// most common case
double result;
if(double.TryParse(number,NumberStyles.Any, CultureInfo.InvariantCulture, out result)) {
    // parseInt(12.42) == 42
    return NumberClass.New(sign * Math.Floor(result));
}
else {
    return this["NaN"];
}

.NETはとしてdouble.TryParse解析'123asd'されません123が、文字列全体を解析できないことを返します。

Jintでバグレポートを記入する必要があります。

E:これは「標準」の問題です。すべての実装で100%互換性のある標準を取得することはできません。常に違いがあります。IEとChrome、FirefoxとOperaを見てください。それらはすべて異なるjavascriptエンジンを使用しているため、違いが予想されます。本当に相互互換性を持たせたい場合は、標準に従って実装し、すべての非標準の動作を実装のバグとして扱う必要があります。このバグを回避しようとするか、報告して修正されることを期待するかは、あなた次第です。

于 2012-12-29T20:16:44.417 に答える
3

.NETでのJavaScriptの実行方法とInternetExplorerなどのWindowsプログラムでのJavaScriptの実行方法を1:1で一致させる方法を探している場合は、Windowsスクリプトエンジン(Jscriptだけでなくまた、ここでSOで説明されているVBScriptまたはその他のActiveXスクリプト言語): C#でJSを解析して実行します

これは、この手法を使用してコードを実装する方法です。

        var script = @"
                           function show( )
                           {
                                  return  parseInt('123asd'); //in js it's 123
                           }"; // Note I have removed the return as it's not needed here

        using (ScriptEngine engine = new ScriptEngine("jscript"))
        {
            ParsedScript parsed = engine.Parse(script);
            Console.WriteLine(parsed.CallMethod("show"));
        }
    }

これは期待どおりに出力123されます。dynamic注:元のコードは新しいC#キーワードで改善できると思うので、おそらくConsole.WriteLine(parsed.show())直接書くことができます。

于 2012-12-30T10:09:07.170 に答える