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

VSTO插件中捕获System.AccessViolationException后如何正常显示消息框?

解决方案

核心原因与思路

当前模态MessageBox挂起,是因为你在Outlook的UI线程(已处于异常/损坏状态)中调用它,导致线程阻塞。需要在独立的STA(单线程单元)线程中弹出提示框,避开原异常线程的干扰,同时确保用户看到提示后再终止Outlook进程。

修改后的代码

直接替换catch (System.AccessViolationException ex)块的内容即可:

catch (System.AccessViolationException ex)
{
    // 1. 执行异常日志记录
    // write to log

    // 2. 创建独立线程显示提示对话框
    var alertThread = new Thread(() =>
    {
        MessageBox.Show(
            "系统已处于不稳定状态,请手动重启Outlook。",
            "程序异常提示",
            MessageBoxButtons.OK,
            MessageBoxIcon.Warning
        );
    });

    // WinForms UI组件必须在STA线程环境运行
    alertThread.SetApartmentState(ApartmentState.STA);
    // 标记为后台线程,避免阻止进程终止
    alertThread.IsBackground = true;

    // 启动线程并等待用户关闭对话框
    alertThread.Start();
    alertThread.Join();

    // 3. 终止Outlook进程
    Process.GetCurrentProcess().Kill();
}

关键细节说明

  • STA线程设置:WinForms的UI控件(包括MessageBox)必须在STA线程中运行,否则会出现无响应或异常,因此必须调用SetApartmentState(ApartmentState.STA)。
  • 线程等待:alertThread.Join()会让主线程暂停,直到用户关闭提示框,确保用户能看到异常提示后再终止进程。
  • 后台线程标记:IsBackground = true可以防止这个提示线程在进程终止时成为阻碍。

额外建议

  • 日志记录尽量使用独立的轻量日志库(如Serilog、NLog),避免依赖已损坏的应用程序状态,确保异常信息能正常写入。
  • 提示文案可以补充操作指引,比如提醒用户先保存未完成的邮件内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:14:55