0

几年前,我编写了一个 C#.NET 程序,该程序使用 Microsoft ACE 和 JET OLEDB 将 Excel 电子表格转换为 CSV 文件。最近我们升级到了 Windows Server 2008 x64 服务器。由于 JET 已被弃用,该方法不再有效。最初,Excel 2003 中的 .xls 文件使用 JET 处理,而 Excel 2007 中的 .xlsx 文件使用 ACE 处理。我更改了连接字符串以对两者都使用 ACE。

我们现在可以通过命令提示符成功运行程序。但是,当我们使用我们的自动化软件(显然运行类似于 Start->Run 方法的程序)时,我们会收到一条错误消息,指出未安装 Microsoft 数据访问组件。经过研究,它们似乎只能在 32 位系统上运行,并且不支持 Windows Server 2000 以上的任何系统。

有任何想法吗?我们安装了最新的 beta x64 ACE OLEDB 驱动程序。该程序手动运行良好。我也试过用 x86 的目标平台编译程序。我们还使用自动化软件使用的 windows 帐户成功地手动运行了程序。

4

1 回答 1

1

在 64 位 Windows 上,该进程定义位数:32 或 64。

如果您在 64 位模式下启动程序,并且该程序执行 COM(OLEDB 是基于 COM),它将仅查找 COM 64 位 DLL(实际上,它只使用注册表的 64 位端,而 64位 COM 组件已注册)。

如果您以 32 位模式启动程序,并且该程序执行 COM,它将仅查找 COM 32 位 DLL。

现在,它可以依赖于 C# 编译器的版本,但是今天,大多数 C# 程序都配置为编译为“Any Cpu”。这意味着它们将在 32 位操作系统上运行为 32,而在 64 位操作系统上运行为 64,如果它们直接或间接使用 COM,这会使事情变得非常复杂(有时,您甚至不知道您正在使用 COM!) .

所以……总结一下:

1) 确定进程的位数(使用任务管理器很容易,64 位机器上的 32 位进程以“*32”为后缀)。

2)安装相应的COM OLEDB驱动。

如果 OLEDB 驱动程序在 64 位模式下不存在,那么您必须重新编译 C# .EXE 或对其进行修补以强制 32 位模式。您可以为此使用CORFLAGS工具。

于 2010-12-02T21:29:59.187 回答