对Access Interop
位的引用与您的异常无关,并且Access Interop不需要使用System.Data.OleDb
中的类。
当您的应用程序编译为AnyCPU Platform
,您在64位系统上运行并且安装的ADO.NET提供程序(Microsoft ACE.OLEDB.12.0)是32位版本时,会出现此问题。
当使用AnyCpu
目标平台时,您的代码将作为64位系统上的64位代码和32位系统上的32位代码执行。以64位执行的应用程序不能使用32位驱动程序(反之亦然)。现在添加一个事实,即Microsoft.ACE.OLEDB.12.0有两个不同的版本。一个用于64位,另一个用于32位,它们不能一起安装在同一台机器上。
最简单的解决方法是通过Visual Studio菜单更改应用程序的目标平台
BUILD -> Configuration Manager -> Active Solution Platform -> x86
如果x86
选项已不存在,然后选择新建,将其命名为x86
,Copy Settings from AnyCPU
检查Create new project platforms
如果您认为在64位操作系统上使用32位应用程序会导致性能下降或需要避免的情况,请仔细阅读并阅读this reference,其中严格检查AnyCpu的PRO和CONS。如果您没有特定的理由使用AnyCpu
,最好留在x86
。
当然,另一种选择是卸载32位版本并安装64位版本的ACE from here,然后在64位系统上以AnyCpu的身份运行应用程序。但是这对于您的部署方案可能是一场噩梦。如果您的x64目标机器上安装了Microsoft Office 32bit版本会怎么样?Office安装了它的位兼容版本的ACE,并且如前所述,在同一台机器上安装32位和64位ACE是不可能的。
现在,您还应该要求客户重新安装64位Office,以保持64位应用程序的快乐。
UPDATE
情况已经改变了一点与Visual Studio的最新版本。现在有一个新选项是新项目的默认选项。它被称为
AnyCPU首选32位模式。在这个链接的更多细节:
What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11和另一个有趣的帖子(尽管关于Sql Server Compact)是这一个
The trouble with Any CPU–Prefer 32 bit–BadImageFormatException
谢谢您的回应。我的操作系统是Windows 7 64位。请参阅我编辑的问题,我在批量生成配置中添加图像 –
没有批量生成,使用配置管理器,并将主动解决方案平台设置为x86 – Steve
但它是否在两个平台都有效我的意思是有机会使用32位和64位位操作系统。 –