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

Visio VSTO插件Redo时抛出异常但功能正常 是否为可忽略的已知问题

Visio VSTO 调试阶段Redo抛出异常问题解答

这是Visio VSTO开发领域非常常见的已知问题,不需要过度担心。

异常产生原因

  • 你遇到的两个异常本质都是调试器捕获的首次机会异常,不会传递到用户运行时,也不会被当作未处理异常导致程序崩溃。Visio的撤销/重做队列在重放QUEUEMARKEREVENT触发的操作时,会临时锁定相关形状的COM对象指针,你的代码首次访问形状对象时触发的临时错误会被包装成System.Runtime.InteropServices.COMException抛出,VSTO宿主层会自动重试,直到指针解锁后逻辑就能正常执行,所以实际运行没有任何问题。
  • 外层的System.Reflection.TargetInvocationException只是反射调用事件委托时的包装异常,根因就是前面提到的COM临时锁定错误。

处理建议

  • 如果终端用户运行时无任何报错、数据和图表表现正常,完全可以忽略该异常,不需要深入排查。
  • 若要避免调试过程中频繁被异常中断,可以在Visual Studio的异常设置中取消勾选这两个异常类型的「引发时中断」选项,也可以在MarkerEvent处理逻辑中显式捕获特定错误码的COM异常,直接跳过即可。
  • 可选优化:给添加子形状的逻辑套上独立的UndoScope,将整个操作包装为单个撤销单元,能进一步降低这类临时异常的出现概率,参考代码如下:
' 代码示例:用UndoScope包装添加子形状操作
Dim app As Visio.Application = Globals.ThisAddIn.Application
Dim undoScope As Visio.UndoScope = Nothing
Try
    undoScope = app.UndoManager.OpenUndoScope("添加子形状")
    ' 此处放置你原有的添加子形状的业务逻辑
Catch ex As System.Runtime.InteropServices.COMException
    ' 捕获Visio COM对象临时锁定的常见错误码,直接忽略即可
    If ex.ErrorCode = &H8001010A OrElse ex.ErrorCode = &H80004005 Then
        Exit Try
    End If
    ' 其他非预期COM异常可以按需处理
Catch ex As Exception
    ' 其他业务异常处理逻辑
Finally
    ' 确保撤销scope正常提交
    If undoScope IsNot Nothing AndAlso undoScope.IsOpen Then
        undoScope.Commit()
    End If
End Try

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:57:01