3

我的插件是使用 WPFframework 用 c#、NetOffice、ExcelDNA 编写的。有些部分也使用了winforms。主界面是WPF

当显示模式对话框时,用户强制关闭 Excel。下次他们启动 excel 时,Excel 会说“Excel 在 ' * ' 加载项方面遇到了严重问题。如果您多次看到此消息,您应该禁用此加载项并检查是否有可用更新。做你想禁用这个加载项吗?”

是的,没有

用户通常在不阅读消息的情况下单击是或输入,然后我的加载项从 Excel 中消失。所以我不希望这个对话框出现。有可能吗?怎么做?谢谢

我尝试在 AutoOpen() 中捕获所有异常,如下所示。但似乎根本没有停止对话的效果。

    public void AutoOpen()
    {           
.....
            System.Windows.Forms.Application.ThreadException += ApplicationOnThreadException;
            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
            Dispatcher.CurrentDispatcher.UnhandledException += CurrentDispatcher_UnhandledException;
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; 
.... 
    }


    public void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    {
        Helper.LogError(e.Exception);            
    }

    public void ApplicationOnThreadException(object sender, ThreadExceptionEventArgs threadExceptionEventArgs)
    {
        Helper.LogError(threadExceptionEventArgs.Exception);
    }

    public void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs args)
    {
        if (!(args.ExceptionObject is ThreadAbortException))
        {
            Exception exc = args.ExceptionObject as Exception;               
            Helper.LogError(exc);
        }           
    }

    public void CurrentDispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        Helper.LogError(e.Exception);
        e.Handled = true;
    }
4

1 回答 1

2

我认为“用户强制关闭 Excel”是指用户从任务管理器或其他东西结束 Excel 进程。

Excel 在功能区处理程序调用周围放置了一些内部保护措施,因此如果 Excel 在功能区事件处理程序期间崩溃,Excel 知道崩溃发生时调用了哪个加载项,以便在下次按照您的描述禁用。因此,如果在显示模式对话框时 Excel 意外终止,则您的加载项将被记住为“原因”。

您处理未处理异常的尝试不太可能奏效,因为 .NET 托管在本机进程(在 Excel 中)。因此,冒泡到 Excel 的未处理异常不会返回到 .NET 运行时,但更有可能使整个 Excel 进程崩溃。因此,尝试处理更多异常不太可能有帮助。

也许模式对话框不是正确的方法,因为它会使您的用户感到困惑并认为 Excel 已崩溃,从而导致意外终止。至少要确保将 Excel 窗口设置为模态对话框的父级,以便对话框停留在 Excel 前面。

于 2013-05-09T17:29:13.553 回答