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
相关产品推荐
相关产品推荐

