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

adr*_*fek 10 c# office-interop excel-interop

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

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

Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application(); 
Run Code Online (Sandbox Code Playgroud)

第二行导致延迟.

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

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

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

事实:

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

主要问题:

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

外部内容

编辑 - 附加测试

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

ppApp = new Microsoft.Office.Interop.PowerPoint.Application();
Run Code Online (Sandbox Code Playgroud)

adr*_*fek 8

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

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

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

HKEY_USERS\S-1-5-21-2929665075-1795331740-364918325-1024\Software\Microsoft\Office\15.0\Excel\Resiliency\DocumentRecovery
Run Code Online (Sandbox Code Playgroud)

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

解决方案: 删除"Resilency"注册表树可以解决问题.

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


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

感谢您的关注 - 阿德里安