在构建服务器上使用 Microsoft.Office.Interop dll 进行单元测试失败

Posted

技术标签:

【中文标题】在构建服务器上使用 Microsoft.Office.Interop dll 进行单元测试失败【英文标题】:Unit test with Microsoft.Office.Interop dll fails on build server 【发布时间】:2011-10-09 09:39:48 【问题描述】:

我写了一个单元测试。被测代码引用了 Microsoft.Office.Interop.Excel.dll。

测试在我的机器上运行良好,但在构建服务器上失败。它在 Excel 应用程序被实例化的那一行失败:

var application = new Application  Visible = Visible ;

错误是:

System.Runtime.InteropServices.COMException: 
Retrieving the COM class factory for component with CLSID 
00024500-0000-0000-C000-000000000046 failed due to the following error:
80040154 Class not registered

这是否意味着我必须在我的构建服务器上安装可再发行主互操作程序集?如果是这样,我是否还需要在构建服务器上安装 Excel?

编辑: Microsoft.Office.Interop.Excel.dll 包含在我的解决方案中,并从那里引用。

【问题讨论】:

如果您的测试需要程序集存在,那么显然它需要在运行测试的机器上。还是你在问别的?您也许可以在该机器上注册单个 DLL,而不必安装 Excel。使用 dependency walker 检查 DLL 的依赖关系。 我很确定您必须在构建服务器上安装 Office 才能使其正常工作。 @Peter 谢谢,我已经编辑了我的答案以澄清。我已经尝试注册 dll,但我得到“找不到 DllRegisterServer 入口点。无法注册此文件”,就像这个人一样:serverfault.com/questions/59431/… 必须在该计算机上安装 Office。 不要尝试注册任何东西,你没有编写 COM 服务器,只是一个 COM 客户端。 【参考方案1】:

如果您将 Microsoft.Office.Interop.Excel.dll 添加到库文件夹中的解决方案并引用其中的程序集,则构建机器应该在您升级时获得所需的程序集。否则,您将引用安装 Excel 时附带的程序集。此外,如果您尝试在未将其放入解决方案的情况下分发您的应用程序,任何尝试运行未安装 Excel 的应用程序的人都会遇到运行时错误。

当然,如果您不想重新分发程序集,您还有一个选择是在调用 Excel 程序集的代码周围放置一个 try/catch,然后向用户显示一条消息,说明需要安装 Excel .

最后,每个版本的 Excel(2010、2007 等)都有不同的版本号。这意味着,如果您使用的是 2010 程序集并且有人安装了 2007 Excel,他们将收到运行时错误。我最终使用的答案是反射来选择在他们的环境中使用哪个程序集。

【讨论】:

嗨,马库斯。谢谢,是的,我已经在解决方案文件夹中拥有 .dll,并从那里引用它。我将更新问题以澄清。 您是否正在运行任何类型的脚本来在构建机器上注册程序集?【参考方案2】:

是的,看来你需要install the PIA:

Microsoft Office 产品的主要互操作程序集也可在可再分发的 Microsoft Windows Installer 程序包中获得:

Microsoft Office 2003 软件包可从 Microsoft 下载中心 (http://go.microsoft.com/fwlink/?LinkId=50479) 下载。

2007 Microsoft Office system 的软件包可从 Microsoft 下载中心 (http://go.microsoft.com/fwlink/?LinkId=72637) 下载。

而且,为了完整起见,Office 2010 软件包在这里:(http://www.microsoft.com/download/en/details.aspx?id=3508)

【讨论】:

【参考方案3】:

您需要为该版本安装 Office 和主互操作程序集,或安装 Visual Studio 以使其正常工作。在 CI 环境中运行时您可能会遇到 COM 问题,如果您可以重组测试以避免使用 Office Interop,我强烈推荐它。

【讨论】:

奖励:如果您在 x64 Server 2008 机器上使用 Office 2007 进行测试,请准备好破解注册表以使其正常工作。 抱歉,您是说我需要安装 ((Office && PIA) || Visual Studio) 或 (Office && (PIA || Visual Studio))? :-) Visual Studio 将 PIA 程序集安装为“Office 开发人员工具”的一部分。在 VS2010 中,这些包括 2007 和 2010 PIA 程序集在此('C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12' 或 'Office14')文件夹中。如果您安装 Office(2k7 或 2k10),您可以通过启用 '.Net Programmability Support 来安装它们。第三个选项,是安装Office,和PIA redist。如果您已安装 Office,并且只想运行简单的设置而不是在“更改”模式下运行 Office 安装程序,则第三个选项很有用。

以上是关于在构建服务器上使用 Microsoft.Office.Interop dll 进行单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章

ExportAsFixedFileFormat 突然不从 Excel 文档中导出图像和格式有啥想法吗?

在构建服务器上使用 APKTool 的 Crashlytics

在带有 Windows Server 2008 R2 的构建服务器上使用 Devenv.com 构建 VS 2003 解决方案

EF4.1 - 在单独的构建服务器上使用 TFS 团队构建的预生成视图是不是存在问题?

在构建服务器上使用 MS Visual Studio Community 2017

在构建服务器上使用 VCS 在 GitHub 上使用 Composer 和 Private Repository