Как отключить диалоговое окно «Отключить надстройку», когда Excel принудительно закрывается

Моя надстройка написана на С#, NetOffice, ExcelDNA с использованием WPFframework. Часть тоже использует 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;
    }

person toosensitive    schedule 08.05.2013    source источник
comment
Я знаю, что это старо, но вы когда-нибудь находили обходной путь? Я разрабатываю надстройку VSTO, и это действительно больно, по крайней мере, при отладке.   -  person Jacob H    schedule 04.05.2018


Ответы (1)


Я предполагаю, что под «пользователи принудительно закрывают Excel» вы имеете в виду, что пользователь завершает процесс Excel из диспетчера задач или что-то в этом роде.

Excel устанавливает некоторые внутренние средства защиты вокруг вызовов обработчика ленты, поэтому в случае сбоя Excel во время обработчика событий ленты Excel знает, какая надстройка была вызвана, когда произошел сбой, чтобы отключить ее в следующий раз, как вы описываете. Поэтому, если Excel неожиданно завершает работу во время отображения вашего модального диалогового окна, ваша надстройка запоминается как «причина».

Ваша попытка обработки необработанных исключений вряд ли сработает, поскольку .NET размещается в собственном процессе (в Excel). Таким образом, необработанные исключения, которые всплывают в Excel, не будут возвращены в среду выполнения .NET, но, скорее всего, приведут к сбою всего процесса Excel. Поэтому попытка обработать больше исключений вряд ли поможет.

Возможно, модальное диалоговое окно не является правильным подходом, поскольку оно приводит пользователей в замешательство и заставляет думать, что произошел сбой Excel, что приводит к неожиданному завершению работы. По крайней мере, не забудьте установить окно Excel в качестве родителя модального диалогового окна, чтобы диалоговое окно оставалось перед Excel.

person Govert    schedule 09.05.2013
comment
Спасибо. Да, пользователи закрывают Excel из диспетчера задач и щелкают правой кнопкой мыши значок Excel и закрывают все окна в строке состояния. Когда данные извлекаются из веб-службы, My addin показывает модальное диалоговое окно с кнопкой «Отмена». Если пользователи хотят отменить подписку, они могут нажать кнопку. Если их не отменить, диалоговое окно будет отображаться перед Excel до тех пор, пока не будет выполнена выборка данных. Я использую WPF, родительский элемент окна доступен только для чтения. Я вызываю его ShowDialog из обработчика событий щелчка ленты. Поэтому я не уверен, как установить его родителем как Excel. - person toosensitive; 09.05.2013
comment
Я замечаю, когда myadd отключен. Помощник myadd com помещается в disabledItems. myadd.xll все еще находится в активном списке. Поэтому мне интересно, есть ли способ загрузить/сгенерировать помощник myadd com в AutoOpen? Благодарность - person toosensitive; 10.05.2013
comment
Вы можете попытаться выяснить, где в реестре записаны отключенные элементы, а затем удалить эти элементы реестра из файла AutoOpen. Одно место может быть примерно таким: HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Resiliency\DisabledItems - person Govert; 10.05.2013
comment
Спасибо, это тоже не работает. Я удалил реестр из AutoOpen, после этого Excel не перезагружает надстройку. Кажется, до вызова AutoOpen Excel уже помечал отключенные элементы. - person toosensitive; 04.06.2013