3

我刚刚发现了window.external允许在托管类似 IE 浏览器的 winform 程序中调用 C# 函数的对象。

我把 MSDN 上的文档和 stackOverflow 上的一些线程都加红了,但我没有发现这些调用是否是同步的,而且,它是可定制的吗?

我在 MSDN 文档中创建的唯一内容没有谈到这个主题 =/

4

1 回答 1

3

这些调用自然是同步的,但通常异步处理它们是有意义的,以避免在其他情况下可能重新进入 JavaScript 代码。您可以为此使用SynchronizationContext.Post

例如,您window.external.TestMethod()从 JavaScript 调用。在 .NET 方面,它可能如下所示:

this.webBrowser.ObjectForScripting = new ObjectForScripting(this.webBrowser);

// ...

[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class ObjectForScripting
{
    WebBrowser _browser;
    SynchronizationContext _context = SynchronizationContext.Current;

    public ObjectForScripting(WebBrowser browser)
    {
        _browser = browser;
    }

    public void TestMethod()
    {
        _context.Post(_ =>
        {
            _browser.Document.InvokeScript("alert", new object[] { 
                "Process a call from JavaScript asynchronosuly." });
        }, null);
    }
}
于 2013-09-06T07:10:01.743 回答