【问题标题】:How to debug hanging SaveFileDialog如何调试挂起的 SaveFileDialog
【发布时间】:2016-08-31 19:12:08
【问题描述】:

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

我很难解决这个问题,因为整个应用程序只是在之后冻结

// using System.Windows.Forms;
SaveFileDialog dlg = new SaveFileDialog();
// lines to configure dlg left out
dlg.ShowDialog();

在这种情况下尝试关闭 Excel 或 Word 时,会出现“Excel/Word 无法关闭”消息框,人们不得不求助于任务管理器来摆脱它。

Excel 和 Word 都经常挂在“另存为”这一事实尤其令人不安,因为我看不出我的加载项如何干扰这些应用程序的内置“另存为”命令。

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

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

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

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

【问题讨论】:

  • C# MSDN SaveFileDialog 您需要显示所有相关代码.. 如果您使用 COM Interop,也许您是 Marshal.Releating com 对象正确.. 请提供所有相关代码
  • 可能是 SaveDialog 在另一个窗口后面。
  • @JimHewitt 是的,但我已经尝试过将 Excel/Word 窗口制作得非常小,以便对话框在某处可见。即使它由于某种原因显示在屏幕外,如果它具有焦点(并阻止 Word/Excel),按 ESC 应该将其关闭——但 ESC 不会做任何事情。
  • @MethodMan 我相信这确实是相关代码。我已经通过调试进行了广泛的测试,并且在调用SaveFileDialog.ShowDialog() 后确定挂起。加载项很大(例如github.com/bovender/xltoolbox)。
  • 听起来你的代码有问题..如果你在世界范围内有很多用户,那么你似乎有一个潜在的问题,你在说什么类型的插件......再一次显示 2 行代码对任何人都没有帮助,也没有帮助解决您的问题。我会说从检查您的代码开始,以确保您正确处理代码中创建的对象..

标签: c# excel vsto freeze savefiledialog


【解决方案1】:

Excel 在打开/另存为时冻结,就像使用“Warmup”注册表值注册托管加载项一样,即使加载项甚至没有加载。

“Warmup”注册表值在加载项的注册表项中设置为 1 时,曾经被认为会导致 Excel 在启动时加载 VSTO 运行时,而不是在用户首次与加载项交互时加载。显然,it was never implemented 并已从微软的在线documentation of the registry entries for VSTO add-ins 中删除。

从加载项的注册表项中删除“预热”值后,Excel 的“打开/另存为”对话框不再冻结,加载项自己的 SaveFileDialog.ShowDialog() 调用也不再冻结。我不知道为什么会这样,但很明显,“预热”值确实有作用

我能够使用一个不执行任何操作的虚拟插件来重现这一点。如果该虚拟加载项在HKCU\Software\Microsoft\Excel\Addins 中注册而没有“预热”DWORD,则 Excel 工作正常。一旦我添加了值为1DWORD,当我单击“打开”或“另存为”时,Excel 就会冻结 - 再次,虚拟加载项根本不会执行任何操作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2020-08-18
    • 2011-12-05
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多