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 那样访问它的元素。

困难的方法是在 C# 中实现一个模拟 JavaScript 数组对象的类(因此它作为 COMIDispatchEx对象暴露给 JavaScript,并且可以作为testArray[i]. 这样的 C# 类需要实现IReflectIExpando管理接口。如果您想走这条路,我在这里发布了更多详细信息:

这样做的另一种方式。尽管您无法修改页面现有的 JavaScript,但您仍然可以注入一些新的 JavaScript 代码,并随心所欲地使用它。

于 2014-05-06T10:41:42.610 回答
1

我现在真的可以自己使用 IReflect 界面了!:-)

您需要实现这些方法GetProperties和您InvokeMember自己:GetProperties您需要确保返回一个名为“length”的属性和一个“0”的属性,直到数组的长度为 1。InvokeMember你只需检查 JavaScript 想要调用哪个方法并返回正确的结果。

我遇到的最大问题是这个类PropertyInfo是抽象的——所以我不能从中创建一个新对象。所以我需要从中派生一个自己的类并使用它来返回自定义属性名称。

于 2014-05-06T15:10:47.073 回答