WebBrowser控件:window.external访问数组

时间:2014-05-06 09:56:23

标签: c# javascript webbrowser-control window.external

我试图在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错误,说明&#34;预期功能&#34;。

那么如何将数组返回给JavaScript代码?

JavaScript代码已修复(我无法修改)。因此,函数将使用window.external.testfunction()调用,并且作为返回值,JavaScript代码需要一个数组。

如何从C#端实现这一目标?

致以最诚挚的问候,并感谢您提出任何想法

安德烈亚斯

2 个答案:

答案 0 :(得分:2)

  

我认为这不行,因为JavaScript可能会这样   无法使用testArray [i]访问数组元素,确实如此   它?

我在评论中提到的对象将是最简单的方式,但您无法从JavaScript访问其元素testArray[i]

hard 方式将在C#中实现一个模拟JavaScript数组对象的类(因此它作为COM IDispatchEx对象公开给JavaScript,可以testArray[i]访问) 。这样的C#类需要实现IReflectIExpando托管接口。如果你想走这条路,我在这里发布了更多细节:

另一种方法。尽管您无法修改网页的现有JavaScript,但您仍然可以inject some new JavaScript code,并且无论您想要什么,都可以使用它。

答案 1 :(得分:1)

我现在可以通过IReflect界面自行完成工作了! : - )

您需要自己实现方法GetPropertiesInvokeMember:在GetProperties中,您需要确保返回的属性名称为“length”,属性为“0” “直到阵列的长度为1。在InvokeMember中,您只需检查JavaScript要调用的方法并返回正确的结果。

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