.net BadImageFormatException。当在64位模式下运行并安装了32位Oracle客户端组件时,会发生这种情况
当我的.net BadImageFormatException。当在64位模式下运行并安装了32位Oracle客户端组件时,会发生这种情况,.net,oracle,oracle11g,.net,Oracle,Oracle11g,当我的.Net应用程序的上一个尝试连接到oracle数据库时,我收到此错误 错误说明在安装了32位Oracle客户端组件的情况下以64位模式运行时会出现此问题。。很多次客户端安装在x64位而不是32 Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException. This proble
.Net
应用程序的上一个尝试连接到oracle数据库时,我收到此错误
错误说明在安装了32位Oracle客户端组件的情况下以64位模式运行时会出现此问题。
。很多次客户端安装在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)
当32位(x86)dll调用64位dll或反之亦然时,会发生BadImageFormatException。如果使用AnyCPU作为入口可执行文件,那么当在64位机器上运行时,它将以64位运行,但是如果调用32位dll,则会出现异常,这就是为什么AnyCPU并不总是答案 我倾向于以32位(x86)构建所有组件,因为我们仍然需要与一些用VB6(32位(x86))完成的旧组件进行接口。虽然性能可能更好的64位机器,如果我们在哪里建立任何CPU的可靠性对我们来说更重要
我建议您尝试用32位(x86)构建所有组件,除非您正在做一些非常密集的工作,否则我怀疑这会有多大不同。一个解决方案是在您的计算机上同时安装x86(32位)和x64 Oracle客户机,那么您的应用程序在哪个体系结构上运行并不重要 下面是在一台计算机上安装x86和x64 Oracle客户端的说明:
假设:Oracle Home称为
OraClient11g_home1
,客户端版本为11gR2
- (可选)删除任何已安装的Oracle客户端(查看是否面临问题)
- 下载并安装Oracle x86客户端,例如安装到
C:\Oracle\11.2\Client\u x86
- 下载Oracle x64客户端并将其安装到不同的文件夹中,例如C:\Oracle\11.2\Client\u x64
- 打开命令行工具,转到文件夹%WINDIR%\System32,通常是
,并创建指向文件夹C:\Windows\System32
的符号链接C:\Oracle\11.2\Client\u x64
(请参阅下面的命令部分)ora112
- 更改到文件夹%WINDIR%\SysWOW64,通常是
,并创建一个符号链接C:\Windows\SysWOW64
,指向文件夹ora112
(见下文)C:\Oracle\11.2\Client\u x86
- 修改
环境变量,用PATH
替换所有条目,如C:\Windows\System32\ora112
和C:\Oracle\11.2\Client\u x86
,分别替换它们各自的C:\Oracle\11.2\Client\u x64
子文件夹。注意:\bin
不能在路径环境中C:\Windows\SysWOW64\ora112
- 如果需要,将您的
环境变量设置为ORACLE\u HOME
C:\Windows\System32\ora112
- 打开注册表编辑器。将注册表值
设置为HKLM\Software\ORACLE\KEY\u OraClient11g\u home1\ORACLE\u HOME
C:\Windows\System32\ora112
- 将注册表值
设置为HKLM\Software\Wow6432Node\ORACLE\KEY\u OraClient11g\u home1\ORACLE\u HOME
(非C:\Windows\System32\ora112
)C:\Windows\SysWOW64\ora112
- 你完了!现在,您可以无缝地同时使用x86和x64 Oracle客户端,即x86应用程序将加载x86库,x64应用程序加载x64库,而无需对系统进行任何进一步修改
- 将
环境变量(注册表中的相应TNS\u ADMIN
项)设置为公共位置,例如TNS\u ADMIN
,可能是一个明智的选择TNS\u ADMIN=C:\Oracle\common\network
cd C:\Windows\System32
mklink/d ora112 C:\Oracle\11.2\Client\u x64
cd C:\Windows\SysWOW64
mklink/d ora112 C:\Oracle\11.2\Client_x86
注:
两个符号链接必须具有相同的名称,例如ora112
尽管名称不同,文件夹
C:\Windows\System32
包含x64库,而C:\Windows\SysWOW64
包含x86(32位)库。不要混淆。在我的情况下,Oracle 11.232位客户端安装在我的64位Windows2008 R2操作系统上
我的解决方案:在分配给我的ASP.NET应用程序的应用程序池的高级设置中,我将启用32位应用程序设置为真
请参阅下面的单机版.ashx测试脚本,我用它来测试连接到Oracle的能力。在更改应用程序池之前,其响应为:
[以64位运行]连接失败。
…在应用程序池更改之后:
[以32位身份运行]连接成功。
TestOracle.ashx–通过System.Data.OracleClient测试Oracle连接的脚本: 使用:根据需要更改用户、密码和主机变量 请注意,此脚本可以独立使用,而不会干扰ASP.NET web应用程序项目文件。把它放到你的应用程序文件夹里
使用制度;
使用System.Data.OracleClient;
使用System.Web;
公共类handler 1:IHttpHandler
{
私有静态只读字符串m_User=“User”;
私有静态只读字符串m_Password=“Password”;
私有静态只读字符串m_Host=“Host”;
公共void ProcessRequest(HttpContext上下文)
{
context.Response.ContentType=“text/plain”;
字符串结果=TestOracleConnection();
context.Response.Write(结果);
}
公共布尔可重用
{
获取{return false;}
}
私有字符串TestOracleConnection()
{
字符串结果=IntPtr.Size==8?
“[以64位运行]:”[以32位运行]”;
尝试
{
string connString=string.Format(
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="C:\oracle\bin"/>
</oracle.dataaccess.client>
</configuration>
Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.