WPF浏览器抛出错误

时间:2013-07-18 03:11:38

标签: c# wpf browser

我通过InvokeScript使用浏览器控件的WPF变体从C#调用javascript函数。

我可以毫无问题地调用我的函数。但是当我第二次调用它时,它会抛出以下错误:

  

未知名称。 (HRESULT的例外情况:0x80020006   (DISP_E_UNKNOWNNAME))

我使用的代码如下:

this.browser.LoadCompleted += (sender, args) =>
{
   this.browser.InvokeScript("WriteFromExternal", new object[] { "firstCall" }); // works
   this.browser.InvokeScript("WriteFromExternal", new object[] { "secondCall" }); // throws error
};

javascript函数是:

function WriteFromExternal(message) {
   document.write("Message : " + message);
}

我可以通过javascript从页面调用C#函数,并从C#调用,只是不能再次调用。无论我称之为什么功能。

我不明白为什么第二次会失败。

谢谢

编辑:

进行了以下测试(javascript):

        function pageLoaded() {
            window.external.tick();
            window.external.tick();
            window.external.tick();
        }
        window.onload = pageLoaded;
        function WriteFromExternal(message) {
            document.write("Message : " + message);
        }

这就是C#方:

            private int i = 0;
            public void tick()
            {
                invoke("WriteFromExternal", new object[] { "ticked"+ i++ });
            }
            public static void invoke(string method, object[] parameters)
            {
                mainInterface.browser.InvokeScript(method, parameters);
            }

仍然会抛出相同的错误(在第一次调用之后),这表明调用它的位置并不重要,如果多次执行,从C#调用函数将抛出此错误。

2 个答案:

答案 0 :(得分:0)

我做了类似的事情已经有一段时间了,但从我记得你的代码看起来是正确的。但是,我确实记得在我的项目中使用略有不同的模式。我没有委托回页面上的JS方法,而是让我的ScriptingHost方法返回值

EX: C#:

public string tick()
{
   return "some stuff";
}

var msg = window.external.tick();
document.write(msg);

如果你有比简单字符串更复杂的对象,你可以将它们序列化为JSON并将它们解析为JS方面的对象。

var jsonObj = JSON.parse(window.external.someMethod());

不确定您是否能够在脚本对象中更改方法签名,但它至少是另一种方法。

另外,在您当前的实现中,您是否尝试过除document.write之外的其他操作?如果显示警告框,是否会出现相同的错误?

答案 1 :(得分:0)

我假设你和我一样,把你的脚本放在身体里。出于某种原因,当您从wpf调用document.write时,它会完全覆盖文档。如果不使用document.write,你附加一个孩子它可以正常工作。因此,将您的JavaScript函数更改为:

 window.WriteFromExternal = function (message) {
   var d = document.createElement("div")
   d.innerHTML= "Message : " + message;
   document.body.appendChild(d);
}
 
 // call from c#
 WriteFromExternal("test")