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()"); } } }