Вот уже несколько недель мы боремся с проблемой, из-за которой у небольшого числа клиентов наш плагин Outlook выгружается и отключается по еще не определенным причинам. Под «отключенным» я подразумеваю, что Outlook изменяет следующее значение реестра с 3 на 2, что фактически означает, что надстройка не будет загружена при следующем запуске:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[OurAddin.sProgID]\LoadBehavior
Нет сообщения об ошибке, и никакие исключения не отображаются в файлах журнала, которые производит наш плагин.
Я уже нашел следующую страницу, которая конкретно касается проблемы изменения LoadBehavior: http://blogs.msdn.com/vsod/archive/2008/04/22/Troubleshooting-com-add-in-load-failures.aspx
Однако ни одна из возможных причин, предложенных там, не представляется применимой:
- Надстройка не просто указана в списке отключенных элементов.
- Не существует необработанных исключений ни в методах
IDTExtensibility2
, ни где-либо еще в коде. Весь код обернут в эквиваленты try / catch, и весь вывод исключений передается только через OutputDebugString
или в файл журнала.
- Ошибка, по-видимому, не зависит от антивирусного программного обеспечения, т. Е. Также возникает при ее отключении.
- Отключение всех других надстроек также не влияет на ошибку.
Итак, что еще может заставить Outlook отключить надстройку?
Некоторые подробности / наблюдения:
- До сих пор нам не удавалось воспроизвести проблему в наших тестовых средах, поэтому мы еще не смогли подключить отладчик во время возникновения проблемы.
- Эта проблема никогда не возникает, пока мы пытаемся посмотреть, что происходит через удаленную поддержку (TeamViewer). Я подозреваю, что это потому, что TeamViewer использует подключаемую библиотеку DLL, которая внедряется во все запущенные процессы (включая Outlook) и, таким образом, влияет на структуру памяти, время, порядок потоков, что угодно.
- Всякий раз, когда мы компилируем новую версию надстройки, чтобы опробовать что-то новое, надстройка будет нормально работать в течение пары часов или даже дней, чтобы в конечном итоге снова отключиться. Как только это произойдет, все последующие попытки загрузить надстройку для загрузки на эту машину (путем ручного изменения значения LoadBehavior) потерпят неудачу (т. Е. LoadBehaviour просто вернется к 2), пока мы не скомпилируем и не развернем другую сборку (или не попытаемся наблюдать с TeamViewer - см. Выше).
- Обычно надстройка выгружается прямо при запуске Outlook, хотя иногда это также происходит после того, как Outlook уже работает в течение некоторого времени. Файл журнала в этих случаях выглядит совершенно незаметно - надстройка просто проходит обычные шаги завершения работы, как если бы Outlook был нормально закрыт.
- Насколько я могу судить по нашим файлам журналов и наблюдая за проблемой через SysInternals ProcessMonitor, когда надстройка отключается при запуске Outlook (а не во время сеанса), DLL выгружается даже до COM-объекта (то есть надстройки). ) создается (сообщения журнала в конструкторе никогда не отображаются).
- Мы поместили
OutputDebugString
сообщений в initialization
разделы (это DLL-библиотека Delphi). Ни один из них не появляется, когда надстройка не загружается.
Эта проблема затрагивает только очень небольшую часть наших клиентов. У нас есть несколько десятков тысяч установок, от которых мы не получили никаких сообщений об этом.
ОБНОВЛЕНИЕ: Кажется, что часто (но не всегда) одна из последних вещей, которая регистрируется перед выгрузкой надстройки, является исключением с текстом «OLE error 800A01A8». Это исключение отлавливается глобальным обработчиком исключений, встроенным в используемый мной фреймворк ( Add-in-Express ), и, по-видимому, нигде не создается из моего собственного кода, каждый метод которого к настоящему времени полностью завернутый в try..catch
. Обычно это происходит сразу после того, как я установил видимость моих CommandBarButtons из обработчика событий инспектора Activate.
Общие свойства всех затронутых машин:
- Windows XP Professional, современный уровень исправлений
- Outlook 2003 Professional, современный уровень исправлений
- различные версии McAfee Virus Scan (хотя отключение не имеет никакого эффекта - см. Выше)
- Пользователи являются членами локальной группы администраторов
Еще одна вещь, на которую стоит обратить внимание, что, вероятно, также очень важно (хотя, может быть, не так сильно, как я думал):
Мы используем модуль лицензирования / защиты от копирования от стороннего производителя, который упаковывает скомпилированную DLL в «оболочку» и распаковывает ее только на лету. С тех пор, как я узнал, что надстройка выгружается еще до того, как исполняется какой-либо наш собственный код, это стало моим главным подозрением. Тем не менее, хотя поставщик подтвердил, что в их коде могут быть необработанные исключения, файл журнала, созданный специальной отладочной версией оболочки защиты, показал, что процесс распаковки завершен успешно, и управление уже передано защищенной DLL до того, как Outlook выгрузил надстройку , Таким образом, кажется, что все, что заставляет Outlook выгружать наш плагин, происходит между завершением инициализации оболочки защиты и нашим собственным кодом.
Есть еще идеи?