如何调试挂起的 SaveFileDialog

How to debug hanging SaveFileDialog

我的 VSTO 加载项的多个用户报告在应显示 "Save as" 对话框时发生挂起。 Excel 加载项和 Word 加载项都会发生这种情况。有趣的是,这两个应用程序在对文档调用 "Save as" 命令时也往往会挂起。

我很难解决这个问题,因为整个应用程序在

之后就死机了
// using System.Windows.Forms;
SaveFileDialog dlg = new SaveFileDialog();
// lines to configure dlg left out
dlg.ShowDialog();

在这种情况下尝试关闭 Excel 或 Word 时,会出现一个消息框 "Excel/Word can not be closed",人们不得不求助于任务管理器来摆脱它。

Excel 和 Word 都经常挂在 "Save as" 上这一事实特别令人不安,因为我看不出我的加载项如何干扰内置 "Save as"这些应用程序的命令。

更糟糕的是,加载项甚至不需要加载。通过取消选中 "COM add-ins" 中的相应条目并重新启动应用程序来停用它们并不能解决问题。我必须完全删除加载项以确保 "Save as" 不会冻结应用程序。

这让我认为问题不在于我的加载项中的代码,而仅仅是(非活动的)VSTO 加载项的存在阻止了文件对话框的出现,从而导致挂起。

挂起并不总是发生,也不是在所有机器上都发生。很随意。

我将如何进一步调查此事?我有 Visual Studio Professional 2013,但不知道如何找出 Office 应用程序冻结的原因和位置。

Excel 在 Open/Save 时冻结,就像使用 "Warmup" 注册表值注册托管加载项一样,即使加载项甚至没有加载也是如此。

"Warmup" 注册表值,当在加载项的注册表项中设置为 1 时,曾经应该导致 Excel 在启动时加载 VSTO 运行时,而不是在第一个用户时发生与加载项的交互。显然, and has since been removed from Microsoft's online documentation of the registry entries for VSTO add-ins.

从加载项的注册表项中删除 "Warmup" 值后,Excel 的 Open/Save As 对话框不再冻结,加载项自己的 SaveFileDialog.ShowDialog() 电话。我不知道这是为什么,但显然 "Warmup" 值确实做了 某事 .

我能够使用不执行任何操作的虚拟加载项重现此问题。如果该虚拟加载项在 HKCU\Software\Microsoft\Excel\Addins 中注册而没有 "Warmup" DWORD,则 Excel 可以正常工作。一旦我添加值为 1DWORD,当我单击“打开”或“另存为”时 Excel 就会冻结——同样,虚拟加载项根本不执行任何操作。

因此,如果人们来到这里想知道为什么他们的 Office 应用程序在安装 VSTO 加载项后冻结,我建议从注册表中删除 "Warmup" 值,而不是花费数小时调试他们的代码 (就像我在发现 "Warmup") 之前所做的那样。

我的用户的反馈是积极的。