Excel Addin - OnDisconnection / OnBeginShutdown не вызывается при выходе - PullRequest
2 голосов
/ 07 декабря 2010

Я разработал Shared Addin для Excel с использованием интерфейса Extensibility IDTExtensibility2 в Visual Studio 2008.

Это довольно простой по функциональности. Когда рабочая книга открыта, она сохраняется в списке открытых рабочих книг, когда она закрывается, надстройка создает новый текстовый файл, затем записывает в него какой-то XML, этот файл затем читается другим процессом, который затем десериализует XML .

Надстройка работает в обычных условиях - поэтому, если пользователь открывает и закрывает файл, надстройка делает то, что должна, если она выходит из Excel с открытыми книгами, она делает то, что должна.

Проблема в том, что у пользователя открыт Excel с открытыми книгами и он выходит из системы. Два метода: OnDisconnection и OnBeginShutdown не вызываются вообще.

Я сделал две вещи, чтобы проверить это:

  1. Я создал TextWriterTraceListener, который записывал в файл журнала при вызове этих двух методов. Когда Excel выходит из системы, они обычно нажимаются, и информация регистрируется в файле журнала, но когда пользователь выходит из системы, в файле журнала ничего нет.

  2. Внутри обоих этих методов с использованием File.CreateText (имя файла) я создал пустой файл. Когда пользователь обычно выходит из Excel, эти файлы создаются, но еще раз, когда Excel закрывается через выход из системы, эти файлы не создаются.

У кого-нибудь есть идеи, как мне обойти эту проблему? Мне нужно захватить, когда Excel закрывается, когда пользователь выходит из машины ...

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

В итоге было решено подключиться к Microsoft.Win32.SystemEvents.SessionEnding и, когда сработало это системное событие, вручную вызвать метод OnBeginShutdown.

0 голосов
/ 04 октября 2011

У меня была такая же проблема с моим надстройкой Outlook 2010. Это может быть связано с тем, что Outlook 2010 не сигнализирует надстройки, что он выключается .

В частности, Outlook [2010] больше не вызывает методы OnBeginShutdown и OnDisconnection интерфейса IDTExtensibility2 во время быстрого завершения работы.

Аналогичным образом, надстройка Outlook, написанная с помощью Microsoft Visual Studio Tools for Office, больше не вызывает метод ThisAddin_Shutdown , когда Outlook закрывается.

Если вы все еще хотите, чтобы надстройка уведомлялась при завершении работы Outlook 2010 (как я сделал), вам нужно зафиксировать событие Application ApplicationEvents_Event_Quit, используя код, подобный моему ниже (ваш код завершения работы) в любом случае должен работать в обоих методах OnDisconnection и OnBeginShutdown:

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
    // As this is an Outlook-only extension, we know the application object will be an Outlook application
    _applicationObject = (Microsoft.Office.Interop.Outlook.Application)application;

    // Make sure we're notified when Outlook 2010 is shutting down
    ((Microsoft.Office.Interop.Outlook.ApplicationClass)_applicationObject).ApplicationEvents_Event_Quit += new ApplicationEvents_QuitEventHandler(Connect_ApplicationEvents_Event_Quit);
}

private void Connect_ApplicationEvents_Event_Quit()
{
    Array emptyCustomArray = new object[] { };
    OnBeginShutdown(ref emptyCustomArray);
}

public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
{
    addinShutdown();
}

public void OnBeginShutdown(ref System.Array custom)
{
    addinShutdown();
}

private void addinShutdown()
{
    // Code to run when addin is being unloaded, or Outlook is shutting down, goes here...
}
0 голосов
/ 07 декабря 2010

Это раньше вызывало ошибку метода ~ объекта ~ в VB6 дней.

Попробуйте WorkbookBeforeClose или потенциально ProtectedViewWindowBeforeClose.

Одна проблема, с которой вы можете столкнуться, если я правильно помню, эточто вы не можете зафиксировать, когда событие отменяется, поэтому, если вы используете это для очистки, я считаю, что вам также необходимо выполнить некоторую работу в одном из событий активации или открытия, чтобы ваш плагин можно было использовать, еслипользователь отменяет закрывающее действие ....

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...