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

如何对使用C#在JavaScript中创建的自定义对象调用方法?,c#,javascript,browser,mshtml,C#,Javascript,Browser,Mshtml,我有一个网络浏览器控件。我已经在head标记中添加了一些JavaScript,通过添加一个警报,我可以看到它正在按预期工作。在这个js中,我创建了一个函数,并向其原型添加了一些成员,如下所示: function test() { } test.prototype.run = function() { alert('success!') } function createTest() { return new test() } 然后回到C#的内部,我正在做: dynamic

我有一个网络浏览器控件。我已经在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#创建一个新的测试实例


另外,为了获得额外的积分,关于将事件附加到这个自定义对象(比如“complete”成员)以使其回调到我的C#code中,我是否需要了解一些特殊的信息?

尝试将空System.object数组作为第二个参数传递给InvokeScript,然后调用test.run()

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

由于某些原因,“dynamic”关键字不够聪明,无法解决这个问题。您可以将从InvokeScript返回的COM对象强制转换为IExpando(或IReflect)并调用InvokeMember方法。我创建了一个继承自DynamicObject的类,该类重写所有TryXYZ方法,并将它们转换为IReflect/IExpando方法调用。然后,您可以像上面的代码片段那样与对象交互。

结果表明,出于某种原因,“dynamic”关键字不够聪明,无法解决这个问题。您可以将从InvokeScript返回的COM对象强制转换为IExpando(或IReflect)并调用InvokeMember方法。我创建了一个继承自DynamicObject的类,该类重写所有TryXYZ方法,并将它们转换为IReflect/IExpando方法调用。然后,您可以像上面的代码片段那样与对象交互。

我不知道为什么要这样做,但如果我使用反射,我可以找到InvokeMember MemberInfo对象,然后我可以调用它,它将实际调用js对象上的成员!我不知道为什么动态对象没有这样做。。。但我会发布我创建的包装器代码,除非有人能首先找到更干净的方法。我不知道为什么我必须这样做,但如果我使用反射,我可以找到InvokeMember MemberInfo对象,然后我可以调用它,它将实际调用js对象上的成员!我不知道为什么动态对象没有这样做。。。但是我会发布我创建的包装代码,除非有人能先找到更干净的方法。你能检查这个问题吗???:你能检查这个问题吗???: