BadImageFormatException. 当使用32位Oracle客户端组件并在64位模式下运行时,会出现此错误。

52

我的一个.Net应用程序试图连接Oracle数据库时出现了此错误。

错误提示说:当在64位模式下安装32位Oracle客户端组件时,将会发生此问题。但我已经多次确认客户端已经安装在x64位而不是32位。

Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException.  This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       --- End of inner exception stack trace ---
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
       at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
       at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.OracleClient.OracleConnection.Open()
       at CustomizedSetupInstaller.Runscripts.InitializeDBObjects(String connectionString, String dbProvider)

7
您正在使用System.Data.OracleClient。该命名空间已被弃用,并将在未来的 .NET 版本中删除。也许您正在使用32位版本?它也不是 Oracle 客户端的一部分,因此无论您使用的是32位还是64位 Oracle 客户端都是无关紧要的。理想情况下,您应该改为使用 Oracle.DataAccess(或 Oracle.ManagedDataAccess)。 - Luke Woodward
5
小错误:System.Data.OracleClient只是提供程序,它还使用一个必须与架构匹配的Oracle客户端。只有Oracle.ManagedDataAccess不需要安装额外的Oracle客户端。也许Oracle客户端是x64,但你的应用程序是32位的,这也行不通。可以在同一台机器上安装32位和64位的Oracle客户端。 - Wernfried Domscheit
22个回答

1
我想补充一种对我有用的解决方案。 环境:Oracle 11g运行在Windows 2008 R2(64位操作系统)上,客户端是一个.NET框架3.5应用程序(从2.0移植),编译时使用x86平台设置。 我遇到了BadImageFormatException相同的问题。编译成64位可以消除异常,但这对我来说不是一个选择,因为我的应用程序使用32位activex组件,在64位中无法工作。 我通过从Oracle网站下载Oracle Instant Client 11(这只是一堆可进行xcopy的DLL文件),并将文件复制到我的应用程序文件目录中来解决了这个问题。请参见此处:http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf 这已经解决了问题,从ProcMon工具中我可以看到本地复制的oci.dll由System.Data.OracleClient加载,一切正常。 虽然可能可以通过改变环境设置来实现,但这种方法的优点是不会改变服务器配置中的任何设置。

1
我用C#.net开发了桌面应用程序,使用2.0框架和system.data.oracleclient连接Oracle数据库时遇到了类似的错误消息,“尝试加载Oracle客户端库引发了BadImageFormatException。当在64位模式下安装32位Oracle客户端组件时,会出现此问题。”
采用以下解决方案:
  • 项目属性,生成选项卡,选择平台目标:x86
  • 项目清理构建,重新构建解决方案
  • 安装Oracle 11G *32位客户端
现在,它可以工作,因为应用程序设置为32位,并在Win2012 R2服务器上安装了Oracle 32位客户端,希望对你有所帮助。

0

我在控制台应用程序中遇到了这个问题。

在我的情况下,我只是将平台目标更改为“任何 CPU”,您可以右键单击解决方案并单击属性时看到它,您会发现一个选项卡“生成”点击它,您会看到“平台目标:”将其更改为“任何 CPU”,这将解决您的问题。


0
请下载正确版本的Oracle客户端,例如Oracle客户端11.2 32位; 这为我解决了问题。

0
我也遇到了同样的错误,我检查了一下我的系统是64位的,而我使用的是32位版本的oracle.DataAccess。我添加了正确的64位版本,现在问题已经解决了。 以下是Oracle.DataAccess.dll的参考路径:
64位操作系统的正确路径- C:\Oracle\11g_64\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll 32位操作系统的正确路径- C:\Oracle\11g_32\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll

0
正如apc所提到的,“当32位dll调用64位dll或反之亦然”时会出现错误。问题在于,如果您使用AnyCPU构建并在64位环境下运行应用程序,则该应用程序将以64位模式运行。 如果明确为32位和64位重新构建不是一个选项,那么您可以使用一款名为corflags.exe的微软工具,该工具随Windows SDK一起提供。基本上,您可以修改正在执行的程序的exe文件中的一个标志,告诉它在64位环境下以32位模式运行。
有关使用此工具的信息,请参见此处

0
我的是控制台应用程序(它也应该适用于Windows应用程序),我遇到了同样的问题。为了解决这个问题,我将PlatformTarget设置为x64,因为我的System.Data.OracleClient.dll(64位文件)位于C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5。这将明确地使用64位版本的Oracle客户端。如果您的解决方案仅在64位上运行,并且您没有使用像VB中制作的32位dll之类的dll,则这可能会对您有所帮助。我希望它能帮到你。

0

当32位(x86)dll调用64位dll或反之时,会发生BadImageFormatException异常。如果您的入口可执行文件使用AnyCPU,则在64位机器上运行时将以64位运行,但是如果然后调用32位dll,则会出现异常,这就是为什么AnyCPU并不总是答案的原因。

我倾向于将所有内容构建为32位(x86),因为我们仍然必须与一些使用VB6(32位(x86))完成的旧组件进行接口。虽然在64位机器上构建AnyCPU可能会提高性能,但对于我们来说,可靠性更重要。

我建议尝试将所有组件都构建为32位(x86),除非您正在进行一些真正密集的工作,否则我认为这不会有太大的区别。


0
同样的问题。我有Visual Studio 2022 64位和Oracle Instant Client版本21.10.0.0.0。
解决方法:
1. 取消勾选使用64位的IIS Express用于网站和项目 enter image description here 2. 取消勾选优先32位。 enter image description here

-2
请确保注册表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\4.112.# 的 DIIPath 键指向 32 位 Oracle 客户端 BIN 目录。例如,DIIPath 值可以是 C:\app\User_name\11.2.0\client_32bit\bin。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接