如何调试慢速Office应用程序互操作构造函数?

我有一个处理excel的应用程序。 最近我遇到了Excel对象创建速度非常慢的问题。

我用这个简单的代码重新创建了这个问题:

Microsoft.Office.Interop.Excel.Application xlApp; xlApp = new Microsoft.Office.Interop.Excel.Application(); 

第二行导致延迟。

为了测量新对象分配所需的时间,上面的代码已经扩展了时间跟踪解决方案,结果是确凿的。 在NORMAL情况下,上面的代码在0.5s内执行,而在FAULTY-BEHAVIOR的情况下,它可能需要长达5分钟。

没有内存泄漏,并且正确释放了excel对象。 我的解决方案全年24/7运行,没有任何问题。 我不确定它是否重要但是应用程序在20个单独的用户会话(服务器机器)上运行。 因此,此应用程序有20个副本同时运行,可能会导致同时运行20个Excel副本。

这个问题第一次在2个月前被注意到并且已经通过升级Office(2010 – > 2013)解决了。 这次我有更多时间进行调查,遗憾的是结果并不乐观。

事实:

  • 目前只有一台机器受此问题的影响(24个CPU内核,24GB Ram)
  • 当“延迟”发生时,CPU根本没有压力
  • 我尝试使用“进程监视器”应用程序来validation当我们“新的Excel.Application()”构造函数(看看是否有任何过多的磁盘/内存/ CPU使用)时会发生什么 – 没有资源限制的迹象。 没有与COM对象等相关的日志文件的迹象。
  • 这里唯一的问题是这几分钟的延迟。 所有其他Excel Interop命令都照常工作。

主要问题:

  • 有没有办法调试这个Microsoft.Office.Interop.Excel.Application()构造函数,看看哪个部分是一个问题?

外部内容

  • 一个有类似问题的人。 他的解决方案根本无法解决我的问题。

编辑 – 附加测试

PowerPoint构造函数不受延迟的影响

 ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); 

我自己找到了解决方案。 我会发布它,因为其他人可能遇到类似的问题,它可以节省他数小时/天的调查。

我做了什么来找到解决方案?

我已经使用Process Monitor分析了测试应用程序(基本上只有一行创建了新的excel应用程序)并且它没有显示任何重要的内容。 然后我用新启动的Excel过程重复分析。 它突出了许多Windows注册表的读取

 HKEY_USERS\S-1-5-21-2929665075-1795331740-364918325-1024\Software\Microsoft\Office\15.0\Excel\Resiliency\DocumentRecovery 

在上面的位置,我发现了成千上万的钥匙。 它们都是由Excel的“自动恢复”function创建的。 由于数字,在启动新Excel对象时加载它们大约需要40秒。 此数字还被另外10-20个同时加载的会话相乘(我是否提到我的应用程序在20个用户会话上运行?)。

解决方案:删除“Resilency”注册表树可以解决问题。

为什么所有这些“自动恢复”条目首先出现在那里? 我想我不能很好地处理Excel的关闭,它“认为”我经常崩溃并“试图”帮助。


现在剩下的就是阻止它再次发生。 我将仔细研究一下我的ExcelClose()函数。

感谢您的关注 – 阿德里安

我认为问题不在于这个构造函数。 尝试动态创建对象:

 var obj = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 

然后将其强制转换为Microsoft.Office.Interop.Excel.Application

 var xlApp = (Microsoft.Office.Interop.Excel.Application)obj; MessageBox.Show(xlApp.Name); 

我希望减慢速度转移到Activator.CreateInstance调用。

无论如何,您可以尝试通过将以下内容放入app.config文件( 更多详细信息 )来解决它:

    

我还建议您确保运行最新的VSTO Runtime和最新的Office PIA 。