VSTO加载项导致Word在应用程序关闭时崩溃

时间:2017-11-20 07:20:23

标签: vsto crash-dumps word-2016

在过去的几年里,我创建了许多VSTO加载项。它们针对许多版本的MS Word运行(但主要是MS Word 2016)。我在处理每个新项目时共享一个公共代码库。

关闭Word时,我注意到零星崩溃。这是需要任务管理员清理的糟糕崩溃:

  

“Microsoft Word已停止工作”“关闭程序?”

很少发生这种情况。很少见,我耸耸肩作为“Crazy MS Word ..”。

我的同事们也多次注意到这个问题。在我为它们构建一个新的程序集(很少或没有代码更改......)后,它经常消失。

现在情况变得更加严重,因为客户在测试时报告了问题。有趣的是,在客户端计算机上崩溃是可重现的。

我花了最后几天评论代码,试图找出问题所在。我以为我的问题与一些Ribbon Visibility代码有关,但事实证明我只是绕圈子走了..

我尝试通过以下方式获取崩溃转储:

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

运行此命令后,我无法重现错误。

我注意到将我的log4net跟踪级别从WARN更改为DEBUG导致可重现的错误停止。但我不确定它是否已修复。

是时间问题吗?知道我怎么能找到问题的原因吗?

- 编辑 -

@Thomas Weller,我能够使用https://docs.microsoft.com/en-us/sysinternals/downloads/procdump获得崩溃转储 将会看到我如何解释它。

1 个答案:

答案 0 :(得分:1)

我能够使用ProcDump获取内存转储,并显示在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
        };
}