3

Javascript で C# から配列にアクセスしようとしています。

それが JavaScript コードです。

var testArray = window.external.testfunction();
for(var i = 0; i < testArray.length; i++) {
    alert(testArray[i]);
}

ObjectForScripting プロパティに割り当てられた次の C# オブジェクトでテストしました。

[ComVisible(true)]
public class TestObject
{
    public string[] testfunction()
    {
        var test = new string[1];
        test[0] = "test";
        return test;
    }
}

すでにアクセスしようとするtestArray.lengthと、「関数が必要です」という JavaScript エラーがスローされます。

では、配列を JavaScript コードに戻すにはどうすればよいでしょうか?

JavaScript コードは修正済みです (変更できません)。したがって、関数はwindow.external.testfunction()戻り値として呼び出され、JavaScript コードは配列を期待します。

C#側からそれを達成するにはどうすればよいですか?

よろしくお願いいたします。

アンドレアス

4

2 に答える 2

2

おそらく、JavaScript は testArray[i] を使用して配列要素にアクセスできなくなるからです。

コメントで言及したオブジェクトは最も簡単なtestArray[i]方法ですが、JavaScript からのようにその要素にアクセスすることはできません。

難しい方法は、JavaScript 配列オブジェクトをシミュレートするクラスを C# で実装することです (そのため、COMIDispatchExオブジェクトとして JavaScript に公開され、 としてアクセスできますtestArray[i])。このような C# クラスは、インターフェイスを実装IReflectしてIExpando管理する必要があります。このルートに行きたい場合は、ここに詳細を投稿しました。

これを行うさらに別の方法。ページの既存の JavaScript を変更することはできませんが、新しい JavaScript コードを挿入して、好きなことを行うことはできます。

于 2014-05-06T10:41:42.610 に答える
1

IReflect インターフェイスを使用して、実際に動作するようになりました。:-)

GetPropertiesメソッドとInvokeMember自分自身を実装する必要があります。 GetProperties「長さ」という名前で返されるプロパティと、配列の長さ 1 までの「0」のプロパティがあることを確認する必要があります。次に、InvokeMemberJavaScript がどのメソッドを呼び出して正しい結果を返すかを確認します。

私が抱えていた最大の問題は、クラスPropertyInfoが抽象的であるため、そこから新しいオブジェクトを作成できないことでした。そのため、そこから独自のクラスを派生させ、それを使用してカスタム プロパティ名を返す必要がありました。

于 2014-05-06T15:10:47.073 に答える