C# 如何调试挂起的SaveFileDialog

C# 如何调试挂起的SaveFileDialog,c#,excel,vsto,freeze,savefiledialog,C#,Excel,Vsto,Freeze,Savefiledialog,当应显示另存为对话框时,my VSTO加载项的多个用户报告挂起。这在Excel外接程序和Word外接程序中都会发生。有趣的是,在对文档调用Save-as命令时,这两个应用程序都会挂起 我很难解决这个问题,因为整个应用程序在运行后会冻结 // using System.Windows.Forms; SaveFileDialog dlg = new SaveFileDialog(); // lines to configure dlg left out dlg.ShowDialog(); 在这种情

当应显示另存为对话框时,my VSTO加载项的多个用户报告挂起。这在Excel外接程序和Word外接程序中都会发生。有趣的是,在对文档调用Save-as命令时,这两个应用程序都会挂起

我很难解决这个问题,因为整个应用程序在运行后会冻结

// 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应用程序冻结的原因和位置。

Excel在打开/保存时冻结,就像托管加载项使用预热注册表值注册一样,即使该加载项未加载

当在外接程序的注册表项中设置为1时,预热注册表值曾经被认为会导致Excel在启动时加载VSTO运行时,而不是在第一次用户与外接程序交互时加载VSTO运行时。很明显,并且已经从微软的在线服务中删除

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

我可以用一个不做任何事情的虚拟插件来复制它。如果该虚拟加载项在HKCU\Software\Microsoft\Excel\Addins中注册,而没有预热DWORD,则Excel工作正常。只要我添加值为1的DWORD,当我单击“打开”或“另存为”时,Excel就会冻结-同样,虚拟加载项根本不做任何事情

因此,如果有人想知道为什么他们的Office应用程序在安装VSTO插件后会冻结,我建议从注册表中删除预热值,而不是像我发现预热之前那样花几个小时调试代码


我的用户的反馈是肯定的。

您需要显示所有相关代码。。如果您使用的是COM互操作,则可能是封送。正确释放COM对象。。请提供所有相关的编码。保存对话框在另一个窗口后面。@JimHewitt是的,但我已经尝试过了,并将Excel/Word窗口设置得非常小,这样对话框应该在某个地方可见。即使它出于某种原因显示在屏幕外,如果它有焦点并阻止Word/Excel,按ESC键也会关闭它-但ESC没有任何作用。@MethodMan我相信这确实是相关的代码。我已经执行了大量的调试测试,在调用SaveFileDialog.ShowDialog之后,挂起肯定会发生。外接程序非常庞大,例如,听起来您的代码有问题。。如果您在世界范围内拥有大量用户,那么您似乎有一个潜在的问题,您所说的是什么类型的加载项。。再次显示两行代码对任何人都没有帮助,也无助于解决您的问题。我想说的是,从检查代码开始,以确保正确处理代码中创建的对象。。