C#WebBrowser控件:window.external访问子对象

将对象分配给WebBrowser控件的ObjectForScripting属性时,JavaScript可以使用windows.external.[method_name]调用此对象的方法windows.external.[method_name] 。 这没有问题。

但是当我有这样的JavaScript函数(访问子对象)时,我需要如何设计这个C#对象: window.external.app.testfunction();

我使用分配给ObjectForScripting属性的以下C#对象测试了它:

 [ComVisible(true)] public class TestObject { public App app = new App(); } public class App { public void testfunction() { } } 

但不幸的是,这不起作用并导致JavaScript错误说“function预期”。

关于C#对象如何看起来像这个JavaScript命令工作的任何想法?

谢谢你的任何提示

安德烈亚斯

我建议你使用基于InterfaceIsIDispatch的接口将对象模型从C#暴露给JavaScript:

 using System.Runtime.InteropServices; using System.Windows.Forms; namespace WindowsFormsApplication { [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IApp { void testFunction(); } [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ITestObject { IApp App { get; } } [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] [ComDefaultInterface(typeof(ITestObject))] public class TestObject: ITestObject { readonly App _app = new App(); public IApp App { get { return _app; } } } [ComVisible(true)] public class App : IApp { public void testFunction() { MessageBox.Show("Hello!"); } } public partial class Form1 : Form { public Form1() { InitializeComponent(); this.webBrowser1.ObjectForScripting = new TestObject(); this.webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; this.webBrowser1.Navigate("about:blank"); } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { this.webBrowser1.Navigate("javascript:external.App.testFunction()"); } } }