我有一个 ASP.NET 4.5 WebForms Web 应用程序,Microsoft.Office.Interop.Word
用于将 RDF/DOC/TXT 转换为 PDF 文件。我想Microsoft.Office.Interop.Word.Application
在应用程序的整个生命周期中保持一个打开的实例(直到 IIS 重新启动)。原因是初始化初始化Application
是资源密集型的。即使对于小文档,尝试使用程序集转换文档的周转时间也很长(4-5 秒以上),其中大部分时间都在Application.Start()
和Application.Quit()
. 我希望通过持久化应用程序本身,我将能够为我的用户增加文档转换吞吐量。
这是正确的方法吗?实现这一点的最佳方法是将 存储Application
为static
我的非静态类的属性吗?我会以正确的方式解决这个问题吗?
//@see: https://www.codeproject.com/Tips/592957/Converting-Document-Word-Excel
using Microsoft.Office.Interop.Word;
public class DocManager
{
//Microsoft.Office.Interop.Word.Application
private static Application msWordDoc = null;
// C# doesn't have optional arguments so we'll need a dummy value
private static object oMissing = System.Reflection.Missing.Value;
//Microsoft.Office.Interop.Word.Document
private Document doc = null;
public DocManager()
{
if (msWordDoc == null)
{
//1 instance to be available to all users across multiple requests
msWordDoc = new Application
{
Visible = false,
ScreenUpdating = false
};
}
}
}
当 .NET 应用程序停止/重新启动时,我想确保 Word 互操作应用程序关闭并正确发布 - 即使我的应用程序崩溃。我需要在哪里插入代码?CodeProject 中有一个例子,如下所示:
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(msWordDoc);
msWordDoc = null;
}
catch (Exception exReleaseObject)
{
msWordDoc = null;
// Console.WriteLine(CMSResourceFile.REALESE_FAILED+ exReleaseObject);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
如果您想确保 Word 进程正确完成,您需要立即释放所有底层 COM 对象。使用System.Runtime.InteropServices.Marshal.ReleaseComObject在您使用完 Outlook 对象后释放它。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null)以释放对对象的引用。在Systematically Releasing Objects文章中阅读更多相关信息。您可能还会发现何时发布在 .NET 中开发的 Office 加载项中的 COM 对象很有帮助。
请注意,Microsoft 目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)自动化 Microsoft Office 应用程序,因为 Office 可能表现出不稳定在此环境中运行 Office 时的行为和/或死锁。
如果您正在构建一个在服务器端上下文中运行的解决方案,您应该尝试使用已为无人值守执行安全的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方案。如果您使用服务器端解决方案中的 Office 应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将面临整体解决方案稳定性的风险。在Office 服务器端自动化的注意事项一文中阅读有关此内容的更多信息。
如果您只处理开放的 XML 文档,您可以考虑使用Open XML SDK作为解决方法。或者考虑使用任何为服务器端执行而设计的第三方组件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句