3

私のアドインは、WPFframework を使用して c#、NetOffice、ExcelDNA で作成されています。一部には winform も使用されています。メインUIはWPF

モーダル ダイアログが表示されている場合、ユーザーは強制的に Excel を閉じます。次回 Excel を起動すると、「Excel は ' * ' アドインで重大な問題が発生しました。このメッセージが何度も表示された場合は、このアドインを無効にして、更新が利用可能かどうかを確認してください。このアドインを無効にしますか?」

はい・いいえ

ユーザーは通常、メッセージを読まずに [はい] をクリックするか、Enter をクリックすると、アドインが 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 に答える