2

我有一个 WebBrowser 控件。我在 head 标签中添加了一些 JavaScript,我可以通过添加警报看到它按预期工作。在这个 js 中,我正在创建一个函数并将一些成员添加到它的原型中,如下所示:

function test() {
}

test.prototype.run = function() {
    alert('success!')
}

function createTest() {
    return new test()
}

然后回到 C# 内部,我正在做:

dynamic test = this.browser.InvokeScript("createTest");
test.run();

我可以看到测试对象是一些 ComObject 但是当我调用 run() 时没有任何反应。我没有收到任何错误,但没有任何反应。有谁知道如何调用这种类型的自定义对象?

还假设我想摆脱 createTest() 方法,如何从 C# 创建一个新的测试实例?

另外,对于奖励积分,关于将事件附加到这个自定义对象(比如说“完整”成员),我需要知道什么特别的事情,这样它就会回调到我的 C# 代码中吗?

4

2 回答 2

0

尝试传入一个空的 System.object 数组作为 InvokeScript 的第二个参数,然后调用 test.run();

于 2010-06-18T12:29:55.127 回答
0

事实证明,由于某种原因,“动态”关键字不够聪明,无法解决这个问题。您可以做的是将 InvokeScript 返回的 COM 对象转换为 IExpando(或 IReflect)并调用 InvokeMember 方法。我创建了一个继承自 DynamicObject 的类,它覆盖所有 TryXYZ 方法并将它们转换为 IReflect/IExpando 方法调用。然后你可以像上面的代码片段那样与对象进行交互。

于 2011-01-21T23:04:16.903 回答