VSTO надстройка вызывает сбой Word при закрытии приложения

За последние несколько лет я создал множество надстроек VSTO. Они работают со многими версиями MS Word (но в основном MS Word 2016). У меня есть общая библиотека кода, которую я добавляю при работе над каждым новым проектом.

Я заметил спорадический сбой при закрытии Word. Это плохой сбой, который требует диспетчера задач для очистки:

"Microsoft Word перестал работать" "Закрыть программу?"

Это случается очень редко. Достаточно редко, чтобы я проигнорировал это как "Сумасшедший MS Word..".

Мои коллеги также неоднократно замечали эту проблему. Часто это исчезало после того, как я собрал их новую сборку (практически без изменений кода..)

Ситуация сейчас более серьезная, поскольку клиент уже сообщал о проблеме во время тестирования. Интересно, что на клиентской машине сбой воспроизводим.

Последние несколько дней я комментировал код, пытаясь выявить проблему. Я думал, что у меня есть проблема, связанная с каким-то кодом видимости ленты, однако оказывается, что я просто кружил по кругу...

Я пытался получить аварийный дамп с помощью:

adsplus.exe -crash -pn winword.exe -o c:\Temp

После выполнения этой команды я не могу воспроизвести ошибку.

Я заметил, что изменение уровня трассировки в log4net с WARN на DEBUG привело к остановке воспроизводимой ошибки. Однако я не уверен, что это исправлено.

Это проблема времени? Любая идея, как я могу найти причину моей проблемы?

-- Редактировать --

@ Томас Веллер, мне удалось получить аварийный дамп с помощью https://docs.microsoft.com/en-us/sysinternals/downloads/procdump Посмотрим, как я его интерпретирую.

1 ответ

Мне удалось получить дамп памяти с помощью ProcDump, и он показал, что исключение Thread происходило при закрытии Word.

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

У меня был код, похожий на:

Dispatcher dispatcher = System.Windows.Application.Current.Dispatcher;
O.CustomXMLParts parts = null;
dispatcher.WaitUntilApplicationIdle(() =>
{
    parts = doc.CustomXMLParts.SelectByNamespace(Office.Namespace);
});
...

public static void WaitUntilApplicationIdle(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke(action, DispatcherPriority.ApplicationIdle);
}

И я должен был убедиться, что приложение было правильно настроено при запуске Word:

void ThisAddIn_Startup(object sender, EventArgs e)
{
    EnsureApplication();
}

void EnsureApplication()
{
    if (System.Windows.Application.Current == null)
        new Application()
        {
            ShutdownMode = ShutdownMode.OnExplicitShutdown
        };
}
Другие вопросы по тегам