【问题标题】:C# WebBrowser control: window.external access sub objectC# WebBrowser 控件:window.external 访问子对象
【发布时间】:2014-06-19 09:39:25
【问题描述】:

将对象分配给 WebBrowser 控件的ObjectForScripting 属性时,JavaScript 可以使用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 错误提示“预期功能”。

您知道 C# 对象的外观如何让这个 JavaScript 命令正常工作吗?

感谢您对此的任何提示

安德烈亚斯

【问题讨论】:

    标签: c# javascript webbrowser-control window.external


    【解决方案1】:

    我建议您使用基于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()");
            }
        }
    }
    

    【讨论】:

    • 您好 Noseratio,这很好用 - 感谢您抽出宝贵时间回复!安德烈亚斯。
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多