c# - Excel 互操作在装有 Office 2007 的机器上工作,但在装有 Office 2010 的机器上失败

标签 c# excel dll com excel-interop

我有一个 C# WPF (.NET 4.0) 应用程序,它使用 Excel 互操作从 Excel 文件读取数据。

当我在装有 Excel 2007 的开发机器上运行此应用程序时,它运行良好。当我在另一台安装了 Excel 2010 的机器上运行它时,它失败并显示以下错误消息:

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)).

尝试创建 Microsoft.Office.Interop.Excel.Application 对象时失败,如下所示:

var app = new Application();

我的项目引用了 Microsoft.Office.Interop.Excel.dll(版本 14.0.0.0,运行时版本 v2.0.50727),它位于:

C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll

我尝试在引用的 dll 上使用默认设置运行应用程序:

  • 复制本地 = False
  • 嵌入互操作类型 = True
  • 特定版本 = True

我还尝试在引用的 dll 上使用以下设置运行应用程序:

  • 复制本地 = True
  • 嵌入互操作类型 = False
  • 特定版本 = True

但是在装有 Office 2010 的机器上,这些尝试都没有奏效。

其他说明:装有 Office 2010 的机器是 64 位的,装有 Windows 7。我的开发机器是装有 Windows XP 的 X86。

问题

是什么导致了“类未注册”异常,我该如何解决?

编辑

为了回应 Alex 的回答,我尝试将应用构建为 Any CPU、X86 和 X64,但没有任何区别。我仍然收到相同的“类未注册”错误。

编辑2

刚刚在装有 Office 2010 的 32 位计算机上试用了该应用程序。没有错误。因此,这可能是特定机器的问题,也可能是 64 位和 Office 2010 的组合。

编辑3

好的,现在我已经在装有 Office 2010 的另一台 64 位计算机上对其进行了测试。同样没有错误。我认为这意味着特定机器有问题,这不是我的软件的错。啊编程。

最佳答案

初步回答:我的软件没问题,但那台机器上的设置有问题。

编辑

我刚刚发现了一些可能是问题根源的东西。问题机器有Office,但是设置为click-to-run (在互联网上运行)而不是 MSI-based (从 EXE 运行)。这意味着某些注册表设置、DLL、组件等对 Microsoft.Office.Interop.Excel 不可用,因此失败。

编辑2

这绝对是问题所在。刚刚升级到完整的基于 MSI 的 Office 安装,一切正常。

编辑3

将此作为错误添加到 Microsoft Connect:

https://connect.microsoft.com/VisualStudio/feedback/details/672276/excel-interop-fails-on-machine-where-office-is-installed-as-click-to-run#details

关于c# - Excel 互操作在装有 Office 2007 的机器上工作,但在装有 Office 2010 的机器上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052678/

相关文章:

c++ - 使用 Visual Studio 链接第三方库

internet-explorer-8 - Dependency Walker 报告 IESHIMS.DLL 和 WER.DLL 丢失?

跨不同编译器的 C++ 库

c# - 异步方法不需要额外的线程?

c# - datatable.merge 不添加列

c# - WCF 服务中无法在表 '' 错误中插入标识列的显式值

vb.net - 两台不同计算机上的不同互操作引用不起作用

c# - WPF:哪种解决方案?带有关闭按钮和新选项卡按钮的 TabControl

excel - 如何将 Excel 中的组合框列表预先填充到用户窗体中?

xml - DOMDocument 方法有效,XMLHTTP 方法失败 - 为什么?