Собственное окно: дескриптор освобождения при закрытии

В настоящее время я работаю над надстройкой C# .NET для Microsoft Outlook. Целью этой надстройки является сбор результатов поиска из мгновенного поиска Outlook и отображение на настраиваемой панели моих собственные результаты поиска.

Это работает очень хорошо, и с подклассом окна Outlook с собственным окном я получаю строку поиска, и она уже передает ее на мою панель.

Теперь проблема заключается в том, что когда вы закрываете надстройку (через "Файл->Параметры->Надстройки->Надстройки COM", но не с X на панели), надстройка мгновенно прекращает работу, и я не могу вызвать searchboxWindow.ReleaseHandle() заранее, чтобы восстановить цепочку WndProc. Outlook просто вылетает без видимых ошибок.

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    switch ((uint)m.Msg)
    {
        case WindowMessages.WM_DESTROY:
        case WindowMessages.WM_QUIT:
        case WindowMessages.WM_NCDESTROY:
            this.ReleaseHandle();
            return;

        case WindowMessages.WM_KEYUP:
        case WindowMessages.WM_LBUTTONDOWN:
        case WindowMessages.WM_RBUTTONDOWN:
            OnKeyUp();
            break;

        case WindowMessages.WM_EXITSIZEMOVE:
            OnResize();
            break;
    }
}

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

Кроме того, события в основном исходном файле надстройки, такие как AppDomain.CurrentDomain.ProcessExit, this.Shutdown или ((Outlook.ApplicationEvents_10_Event)this.Application).Quit, не вызываются.

Какое событие я могу прослушать, которое (надежно) запускается при завершении работы надстройки? Есть некоторые? Если нет, то какие у меня есть альтернативы для решения моей проблемы?


person Florian Schöffl    schedule 11.08.2015    source источник
comment
Вы пробовали Dipose() и прикрепили метод к событию Diposed, чтобы убедиться, что оно действительно было удалено?   -  person Mr. B    schedule 11.08.2015
comment
Я реализовал интерфейс IDisposable и вызвал там ReleaseHandle(), но это не дало никакого эффекта? Это то, что ты имеешь в виду?   -  person Florian Schöffl    schedule 11.08.2015
comment
Используйте событие Shutdown вашей надстройки, чтобы удалить подкласс окна. Автоматически сгенерированный обработчик событий ThisAddIn_Shutdown() имеет пугающий язык, но он все еще вызывается в этом конкретном сценарии.   -  person Hans Passant    schedule 11.08.2015
comment
Начиная с Outlook 2010, Outlook [...] больше не вызывает метод ThisAddin_Shutdown при завершении работы Outlook. источник – вы уверен, что он вызывается в этом случае? не могу проверить сейчас   -  person Florian Schöffl    schedule 11.08.2015
comment
Это может быть одна из тех редких ситуаций, когда вам может понадобиться реализовать финализатор. Взгляните на эту статью limbioliong.wordpress.com/2011/07/03/   -  person Scott Chamberlain    schedule 12.08.2015


Ответы (3)


РЕШЕНО: спасибо Хансу Пассану

Действительно кажется, что событие ThisAddIn_Shutdown запускается, когда надстройка отключается вручную через диалоговое окно надстроек COM.

person Florian Schöffl    schedule 14.08.2015

Я не думаю, что вы можете многое сделать в управляемом коде. Неповрежденный код работал бы нормально; система COM вежливо спросит вас, можно ли выгрузить вашу dll, вызвав вашу реализацию DllCanUnload.

person Dmitry Streblechenko    schedule 11.08.2015
comment
Так что в основном я ничего не могу сделать, пока не перепишу свой проект на С++ или аналогичный? - person Florian Schöffl; 11.08.2015

Убедитесь, что вы добавили DWORD RequireShutdownNotification=1 в свой реестр надстроек, иначе ThisAddIn_Shutdown() не будет вызываться

person Alex    schedule 01.04.2019