为什么不应该使用 (OLE)自动化

版权声明:所有博客文章除特殊声明外均为原创,允许转载,但要求注明出处。

前言

我喜欢在回答问题之前先考虑另一个问题:这个问题合理吗?但提问题的同学未必会这么想。可能他们已经被项目的压力压迫到不想去思考了,只想得到一个简单粗暴的答案。这个过程其实是一件蛮痛苦的事情,因为我自己需要花额外的精力去思考问题的动机和背景,提问者却经常不领情,并且经常导致我们的对话不在一个频道上。

其中一个典型的案例是关于 Office OLE 自动化的(大部分是 Excel)。遇到这样的问题,我一般会直接建议放弃这个方案。至于提问者的反应则五花八门,虽然大多还算客气,但我能听出来背后通常有这样的意思:你不想答就不答管那么多干嘛。碰到这样的情况我通常选择沉默,因为很难用一两句话讲清楚自己的意思。但既然有自己的博客了,那么我还是花点功夫来解释一下我的想法。

我的项目开发经验告诉我,基于 Office 自动化去处理文件这个方案从根本上说就是错误的,会导致一系列稀奇古怪的问题去让你头疼。选择了错误的解决方案,然后再去想办法解决各种古怪的毛病,说的刻薄一点,就像长了疮以后再去拼命化妆,非但于事无补,反而将更多问题留给了后来接手的人。为什么不在自己手里终结这个问题呢?

有人回答说,项目已经做成这个样子,没有办法,不可能再更换了。对苦逼的码农我表示同情,但并不同意这个结论。以我开发系统的经验,处理 Office 文件是是一个相对独立、容易封装和测试的部分。如果你连重构这点功能的勇气也没有,那我很难想象面对更加复杂的业务时,你还有多少信心去修改代码?让你接手一个没有勇气去修改的的项目,无论对你对公司来说都是不幸的事情。如果你真的确定自己没有能力去修改,我建议你早日辞职,对公司负责同时也是对自己负责;要是公司不允许你修改,我建议你把下面的内容发给他们看一看。他们还是坚持的话——那这样的公司也没什么好留恋的了。

题外话说的有点多了,接下来我从技术方面来说为什么用 OLE 自动化处理 Office 文件是一个糟糕的方法。我在项目里早已抛弃了基于 OLE 自动化的方法。至于替代方案,一般性的项目我会使用开源的 NPOI,有些特别复杂或比较特殊的会使用一些商业方案,老牌厂商如 InfragistcsDevExpressSyncfusionTelerikAspose 等都有不错的组件可以采用。其中 Aspose 还专门写过一篇文章阐述这个问题,我觉得非常全面,所以下面就直接拿这篇文章来翻译了。作为组件厂家,Aspose 这篇文章难免要为自家产品打打广告,但从技术角度来说本文的观点都是可信的。此外,本文还引用了微软自己的说法(参考开头部分的链接)。微软总没有理由故意黑自家产品吧。这篇文章已经引用了微软的重要观点,那篇文章我就不再继续翻译了,有兴趣的自己点进去看即可。

利益相关:我和 Aspose 没有任何关系,也无意替他们做宣传。从纯用户角度来说,Aspose 的产品是很不错的,然而其他几家厂商的产品也各有所长,选择你熟悉的产品即可。只要不是特别复杂的场景,开源的 NPOI 等也足以胜任大多数 Excel 处理任务。

下面正题开始。

原文: Why Not Automation

为什么 Aspose 组件是比 Microsoft Office 自动化更好的选择?

介绍

我们在 Aspose 最常听到两个问题:

  • 你们的产品是否需要先安装 Microsoft Office 才能运行? 简单的回答:“不需要”。 Aspose 组件是完全独立的,不属于微软公司,也不需要经过微软的授权、赞助或审核。
  • 为什么要使用 Aspose 产品,而不是利用 Microsoft Office 自动化? 我们给出一个最短的答案:这里有很多理由,主要的原因是微软自己强烈建议不要在软件解决方案中使用Office自动化:Considerations for server-side Automation of Office

有几个理由可以说明为什么 Aspose 组件是比自动化更好的方案。其中最关键的原因包括:

  • 安全性
  • 稳定性
  • 扩展性/速度
  • 价格
  • 功能

这些要点描述如下。另外,请务必阅读本节末尾的链接。

安全

以下直接引述自上面的微软文章:

Office 应用程序从来没有设计为应用于服务器端,因此并未考虑过分布式组件面临的安全问题。Office 不会对传入的请求进行身份验证,也不会防止您无意中运行宏、或启动其他可能会运行宏的服务实例。请不要打开从匿名网络上传到服务器的文件!基于上次设置的安全选项,服务器可以在具有全部权限的管理员或系统上下文中运行宏,从而破坏您的网络!此外,Office使用了许多客户端组件(例如 MAPI,WinInet 和 MSDAIPP),这些组件为了加快处理速度会缓存客户端身份验证信息。如果在服务端使用 Office 自动化,一个实例可以服务多个客户端,并且由于该会话中已经缓存了认证信息,某个客户端有可能使用其他客户端已经缓存的凭证, 从而通过冒充其他用户来获取未授权的访问权限。

Aspose 产品是非常安全的。 Aspose 组件用 ASP.NET 用户账号运行,与 其他 ASP.NET 应用程序具有相同的上下文。因此,Aspose 组件不会对重要的系统资源构成潜在的风险。此外,当 Aspose 组件打开文档时,宏不会自动运行。Aspose 组件的构建目的是允许开发人员创建、操作和保存 Office 文件。Microsoft Office 软件包相关的任何风险并不会带到 Aspose 产品中。

稳定性

以下直接引述自上面的微软文章:

Office 2000,Office XP 和 Office 2003 使用 Microsoft Windows Installer(MSI) 技术为最终用户提供安装和自修复功能。MSI引入了”首次使用时安装“的概念,允许(在系统级别、或者更经常是在特定用户用户)运行时动态安装或配置功能。在服务器端环境中,这两者都会降低性能,并增加了出现对话框的可能性(这些对话框要求用户允许安装,或提供一个合适的安装盘)。虽然这提高了 Office 作为最终用户产品的弹性,但是在服务器端环境中,Office实施的 MSI 功能是适得其反的。此外, Office 作为常规产品时的稳定性无法在服务端环境下得到保障,因为它并没有设计成这种应用。在网络服务器上使用 Office 作为服务组件可能会降低该机器的整体稳定性。如果您计划在服务端使用 Office 自动化,请尝试将程序隔离到专用的计算机,以避免影响关键功能,并且可以根据需要重新启动。

由于 Aspose 组件被打包成单个 DLL,所以要使用其功能不需要安装其他任何附件。Aspose 组件仅由.NET应用程序使用,没有任何代码需要等待人类用户的应答。Aspose 组件已经过彻底的测试。Aspose 组件被 IBM,希尔顿,读者杂志和美国银行等多家公司所使用。

扩展性/速度

以下直接引述自上面的微软文章:

服务器端组件应该是具备高度弹性的、多线程 COM 组件,消耗很少资源,并为多用户提供高吞吐量。Office 应用在几乎所有方面都是相反的。它们是不可重入的,基于单线程套间(STA)的自动化服务器,被设计为服务单用户,但是消耗大量资源。对于服务端环境,它们只有极少的可扩展性,并且对诸如内存等重要元素具有固定限制,无法通过配置更改。更重要的是,它们使用全局资源(如内存映射文件,全局加载项或模板,并且共享自动化服务器),这会限制可并发运行的实例数量,如果在多客户端环境中使用,将会导致竞争。计划同时运行多个 Office 应用程序实例的开发者需要考虑将对 Office 应用程序的访问“池”化或变为串行访问,以避免潜在的死锁或数据损坏。

Aspose 组件具有高度的可扩展性且快如闪电。 Office 应用程序并未设计成允许成百上千的用户同时使用; 而 Aspose 组件则是为此而设计的。我们的组件是一个真正的.NET解决方案,无论是在单个服务器上运行单个应用程序,还是在负载平衡的 Web Farm 中支持为企业级应用程序,它们都是完美的。

价格

如果用程序使用 Microsoft Office 自动化,必须为运行应用程序的每台计算机购买 Microsoft Office 的副本。很多时候应用程序可能需要创建或操作 Office 文件,但不要求用户必须拥有 Office。 Aspose 提供了非常具有成本效益、免版税、可再分发的许可证,允许部署到无限数量的用户,不需要担心许可问题。

在创建基于Web的应用程序时,有一件很重要的事需要知道: Microsoft Office 自动化组件并未为服务端解决方案定价或授权(仅授权 Office 2000 Web 组件和 Office 服务器扩展)。因此,部署使用 Microsoft Office 组件的 Web 应用程序没有好的许可解决方案。 Aspose 为基于服务器的应用程序提供了非常具有成本效益的解决方案。

功能

Aspose 组件提供了管理 Office 文件所需的一切功能,还有更多其他的东西。它们的设计理念是允许开发人员用最少的努力获得最大的成果。与 Office 自动化不同,Aspose 组件提供了许多功能强大、省时的功能。例如,Aspose.Cells 为开发人员提供从 DataTable 或 DataView 直接导出到Excel文件的功能。Aspose.Words 提供了类似的功能,允许开发人员直接从任何 .NET 数据对象填充 Word 邮件合并文档。 Aspose 系列中每个组件都提供了自己的一套独特而强大的功能。

购买Aspose组件或组件套件的最佳方式是访问我们的开发团队。我们的开发团队意识到,如果您的公司需要功能,则其他公司也可能需要它。虽然不是每个功能要求都会被添加进来,但我们团队在提供帮助时是非常开放而灵活的。这些想法是帮助 Aspose 组件变得如此强大的原因。即便您需要从 Office 自动化对象那里获得附加功能,您也几乎不太可能需要把它们加进去。

结论

本文概括了 Aspose 组件是比 Office 自动化更好的选择的要点。所有各种 Aspose 组件都提供无风险、无评估限制的版本。我们鼓励您利用该评估,以便更好地了解 Aspose 可以为您的应用程序做些什么。

要获取更多信息,请参阅以下Internet文章: