You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Word VSTO自定义任务窗格中嵌入WebView2的WPF控件异常问题

解决VSTO Word中WebView2嵌入WPF自定义任务窗格关闭时的COMException问题

核心解决思路:手动管控资源释放顺序

问题本质是CustomTaskPaneCollections自动释放时,WebView2的COM资源与任务窗格的释放顺序冲突——任务窗格先被释放,但WebView2内部仍有未清理的引用,导致后续访问已释放对象触发异常。以下是具体操作步骤:

  • 提前释放WebView2资源
    在Word插件的ThisAddIn_Shutdown事件中,遍历所有自定义任务窗格,找到托管WPF控件的ElementHost,手动释放WebView2并解除关联:

    private void ThisAddIn_Shutdown(object sender, EventArgs e)
    {
        foreach (CustomTaskPane pane in CustomTaskPanes)
        {
            if (pane.Control is ElementHost host && host.Child is YourWpfUserControl wpfCtrl)
            {
                // 确保在UI线程执行释放操作
                wpfCtrl.Dispatcher.Invoke(() =>
                {
                    wpfCtrl.WebView2Control.Dispose();
                    host.Child = null; // 解除WPF控件与ElementHost的绑定
                });
            }
            pane.Dispose();
        }
        CustomTaskPanes.Clear(); // 清空任务窗格集合
    }
    
  • 在WPF控件内部清理事件与资源
    在承载WebView2的WPF UserControl的Unloaded事件中,取消所有WebView2的事件订阅,避免后台回调访问已释放控件:

    private void YourWpfUserControl_Unloaded(object sender, RoutedEventArgs e)
    {
        // 取消所有已订阅的WebView2事件
        WebView2Control.NavigationCompleted -= WebView2_NavigationCompleted;
        WebView2Control.CoreWebView2InitializationCompleted -= WebView2_CoreWebView2InitializationCompleted;
        
        // 释放WebView2资源
        WebView2Control.Dispose();
    }
    
  • 终止WebView2后台活动
    如果WebView2有正在进行的导航或脚本执行,关闭前提前终止:

    if (wpfCtrl.WebView2Control.CoreWebView2 != null)
    {
        wpfCtrl.WebView2Control.CoreWebView2.Stop();
    }
    

关键注意点

  • 所有WebView2的操作必须在UI线程执行,用Dispatcher.Invoke确保线程安全,避免跨线程访问已释放的COM对象。
  • 不要依赖CustomTaskPane的自动释放逻辑,严格遵循释放顺序:清理WebView2资源→解除控件关联→释放任务窗格→清空集合。

内容的提问来源于stack exchange,提问作者nomacreates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:37:23