如何使用C#在JavaScript中创建的自定义对象上调用方法?

时间:2010-06-17 16:33:35

标签: c# javascript browser mshtml

我有一个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#代码中的任何特殊内容吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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