3

IronJs の最新バージョン (0.2.0.1) を使用していますが、私の js スクリプトは、IronJs.Runtime.ArrayObject を使用して js エンジンに設定された配列の長さを正しく取得しません。ただし、以下の C# コードに示すように、私の変数は配列として認識されています。

var jsCode = @"myArray.length;";
var javascriptEngine = new IronJS.Hosting.CSharp.Context();
var array = new ArrayObject(javascriptEngine.Environment, 2);//array of size 2
array.Put(0, 12.0);//mock values
array.Put(1, 45.1);

javascriptEngine.SetGlobal<ArrayObject>("myArray", array);

var result = javascriptEngine.Execute(jsCode);
Console.WriteLine(result);

var jsCode2 = @"myArray instanceof Array;";
var result2 = javascriptEngine.Execute<bool>(jsCode2);
Console.WriteLine(result2);

次の出力が得られます

undefined
True
4

1 に答える 1

4

これは、IronJS ランタイムのバグです。適切な GitHub リポジトリで問題を開く必要があります: https://github.com/fholm/IronJS/

回避策は、アレイ全体の再割り当てを強制することです。その場合、.lengthプロパティは正しく設定されているようです。これを達成するためのハックな方法は、必要よりも小さいArrayObject(たとえば 0-sized ArrayObject) を作成し、その中にいくつかの値を入れることです。次のテストに合格します。

    [TestMethod]
    public void TestWithZeroSizedArray()
    {
        string jsCode = @"myArray.length;";
        var javascriptEngine = new IronJS.Hosting.CSharp.Context();
        var array = new ArrayObject(javascriptEngine.Environment, 0); // Creates a 0-sized Array
        array.Put(0, 12.0);
        array.Put(1, 45.1);

        javascriptEngine.SetGlobal<ArrayObject>("myArray", array);

        var result = javascriptEngine.Execute(jsCode);
        Assert.AreEqual(2, result);
    }

基盤となる .NET 配列の複数のコピー/再割り当てにより、パフォーマンスの問題が発生することに注意してください。

于 2012-09-06T09:52:24.683 に答える