在 VSTO Outlook 插件中使用 WebView2 控件时出现异步代码问题

Issue with async code when using WebView2 control inside VSTO Outlook plugin

我想在 Outlook 的 VSTO 插件上使用最新的 Microsoft WebView2 控件 (Chromium)。 我无法将 WebView2 的异步接口与 VSTO Outlook.Inspector 和 Outlook 连接在一起。ItemEvents_10_Event,例如发送或关闭。

我想通过从 WebView2 控件调用 ExecuteScriptAsync 来针对这些事件在 WebView2 上执行一些 JS 脚本。

麻烦的是,例如发送事件被声明为 void ItemEvents_10_SendEventHandler(ref bool Cancel) 问题是 ref 变量不能用于异步。

我需要将此异步代码包装成同步以确定 ref Cancel 的结果,但我对此一无所知。我最终遇到了死锁或 WebView2 控件 CoreWebView2 can only be accessed from the UI thread.

的错误

设置为 VS2019、Outlook PIA 15 和 WebView2 1.0.1020.30

在您的事件处理程序中,运行 Windows 消息循环等待异步方法 return

        MSG msg;
        while (PeekMessage(out msg, IntPtr.Zero, 0, 0, 1/*PM_REMOVE*/))
        {

            TranslateMessage(ref msg);
            DispatchMessage(ref msg);
            if (OnlyOnce) break;
        }

Win API 函数定义如下:

[StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct MSG
        {
            public IntPtr hwnd;
            public uint message;
            public UIntPtr wParam;
            public IntPtr lParam;
            public int time;
            public POINT pt;
            public int lPrivate;
        }
        [DllImport("user32.dll")]
        static extern sbyte GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
        [DllImport("user32.dll")]
        static extern bool TranslateMessage([In] ref MSG lpMsg);
        [DllImport("user32.dll")]
        static extern IntPtr DispatchMessage([In] ref MSG lpmsg);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool PeekMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax, uint wRemoveMsg);