我使用了dll Microsoft。办公室Interop。Excel版本15.0.0.0并创建了如下所示的对象
Application excelApp = new Application();
执行悬而未决。
我已经在以下的finally块中释放了COM对象
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(excelApp);
这是发表在citrix上的WPF应用程序。当citrix服务器在windows2008中运行时,它正在工作。但后来它被升级到windows 2016。上述代码行中的excel冻结问题是间歇性的。它只适用于少数用户,不适用于其他用户。
我可以知道如何解决这个问题吗。
我检查了事件查看器,它给出了DistributedCOM错误,而不是创建excel对象时的错误。我附上了事件查看器的图片。在此处输入图像描述
不需要使用Marshal.FinalReleaseComObject
方法,而是尽可能使用Marshal.ReleaseComObject
方法。
以下是微软对此的声明:
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务(自动化Microsoft Office应用程序,因为在这种环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。
如果您正在构建一个在服务器端上下文中运行的解决方案,则应尝试使用可安全执行无人值守的组件。或者,您应该尝试找到至少允许部分代码运行客户端的替代方案。如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。
在"Office服务器端自动化注意事项"一文中了解更多信息。
如果只处理开放式XML文档,则可以考虑使用开放式XML SDK。否则,您可以考虑使用为服务器端执行而设计的组件。