.NET、WinForms。
调用是从UI线程触发的(按钮-点击)。ExecuteScriptAsync的返回应该继续同步处理,即它们应该再次与呼叫上下文同步。我失败了。
我试着举个例子:
private void buttonTest1_Click(object sender, EventArgs e) {
MessageBox.Show(GetMathResult());
}
String GetMathResult() {
// a) Application freezes
//var result = webView.ExecuteScriptAsync("Math.sin(Math.PI/2)").GetAwaiter().GetResult();
//return result;
// b) return null
//String result = null;
//Task task = new Task(async () => { result = await webView.ExecuteScriptAsync("Math.sin(Math.PI/2)"); });
//task.RunSynchronously();
//return result;
// c) Excepion: // InvalidCastException: Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "Microsoft.Web.WebView2.Core.Raw.ICoreWebView2Controller" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM - Komponente für die Schnittstelle mit der IID "{4D00C0D1-9434-4EB6-8078-8697A560334F}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt(Ausnahme von HRESULT: 0x80004002(E_NOINTERFACE)).
//String result = Task.Run(() => GetMathResultTask()).Result;
//return result;
}
Task<String> GetMathResultTask() {
return webView.ExecuteScriptAsync("Math.sin(Math.PI/2)");
}
这也不起作用(参见错误):
private void buttonTest3_Click(object sender, EventArgs e) {
MessageBox.Show(Y());
}
String Y() {
String result = null;
var autoResetEvent = new AutoResetEvent(false);
Task.Run(async () =>
{
try {
result = await webView.ExecuteScriptAsync("Math.sin(Math.PI/2)");
}
catch (Exception exc) {
// !!! {"Das COM-Objekt des Typs \"System.__ComObject\" kann nicht in den Schnittstellentyp \"Microsoft.Web.WebView2.Core.Raw.ICoreWebView2Controller\" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID \"{4D00C0D1-9434-4EB6-8078-8697A560334F}\" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE))."}
Console.WriteLine(exc.ToString());
}
finally {
autoResetEvent.Set();
}
});
autoResetEvent.WaitOne();
return result;
}
我为一个代码样本投标。
5条答案
按热度按时间ohfgkhjo1#
要从
ExecuteScriptAsync
中获取结果,请使用await
运算符,如下所示:**注意:**对于那些想要使用
WebView2
的人,您需要在您的机器上安装WebView2 Runtime和Microsoft Edge Chromium。您还需要在项目中安装WebView2 NuGet package。ymdaylpp2#
我可能不得不这样使用它。这是我能找到的最好的解决方案:
suzh9iv83#
我使用了我自己的解决方案,这对我来说是有效的,但我不知道它是否会在未来引起任何问题(如果有人知道,请添加评论)。它会等待2秒让脚本执行,然后跳出:
js81xvg64#
对于任何在WinForms下使用WebView2并寻找安全,简单和防阻塞解决方案的人来说,这些代码行似乎是合乎逻辑的:
从main方法调用此方法:
现在从这个方法调用这些helper方法:
g52tjvyc5#