如何在控制台应用程序中使用WebView2

11
string text = "return 'test';";
var webView = new Microsoft.Web.WebView2.WinForms.WebView2();
webView.EnsureCoreWebView2Async(null).RunSynchronously();
var srun = webView.CoreWebView2.ExecuteScriptAsync(text);

运行上述代码时,EnsureCoreWebView2Async会出现以下异常:
"Cannot change thread mode after it is set. (Exception from HRESULT: 0x80010106 (RPC_E_CHANGED_MODE))"
我需要怎么做才能在控制台或Windows服务中运行此代码而不使用winform dlg?

2
它可能需要一个同步上下文,以便可以捕获执行上下文(其调度程序)并恢复它。在这里不能使用RunSynchronously() - Jimi
仅供参考,似乎使用如#202所述的HWND_MESSAGE允许在.NET控制台应用程序中无头使用WebView2。 - Uwe Keim
1个回答

13
事实证明,关键之处在于将[STAThread]添加到Main函数中。
class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Microsoft.Web.WebView2.WinForms.WebView2 webView21 = new Microsoft.Web.WebView2.WinForms.WebView2();

        var ecwTask = webView21.EnsureCoreWebView2Async(null);
        while (ecwTask.IsCompleted == false)
        {
            Application.DoEvents();
        };

        var scriptText = @"var test = function(){ return 'apple';}; test();";
        var srunTask = webView21.ExecuteScriptAsync(scriptText);
        while (srunTask.IsCompleted == false)
        {
            Application.DoEvents();
        };

        Console.WriteLine(srunTask.Result);
    }
}

其他值得注意的事项:

  • 有时候你需要设置应用程序的位数,因为使用 AnyCPU 会在创建 WebView2 COM 对象时导致无限等待。
  • 你可能需要设置 webview2 的源属性来强制实例存在。

6
我刚学到,不要使用async Task Main(),因为它无法与STAThread一起正常工作。这个问题可以在这里找到。(我花了1小时才找到这个错误。) - JHBonarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接