场景:
系统:win8 64位
oracle客户端:64位
项目引用的System.Data.OracleClient.dll:32位
错误提示 :
错误提示 :
错误1:
InvalidOperationException: 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
错误2:未能加载文件或程序集 System.Data.OracleClient
配置方式:
方式
1:网站应用程序池的基本设置:【.NET CLR 版本】选择
,【托管管道模式】选择
,在
高级设置中,【启用32位应用程序】设为True。此时报错:
错误1
![](https://i-blog.csdnimg.cn/blog_migrate/d8360f97d35b275b8784cc21bd283b1f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/014662a30b8521c5a37fe462af535b7a.png)
方式2:同方式1,唯一不同是【启用32位应用程序】设为False。此时报错:
错误2
错误原因:
如果是方式1,此时应用程序以32位模式来运行,
System.Data.OracleClient.dll可以正常加载,可以正常进入到登陆页面。但是一旦要连接数据库,应用程序会加载64位版本oracle客户端的oci.dll,而64位oci.dll无法在32位环境下运行。
如果是方式2,此时应用程序以
64位模式来运行,那么一开始就会报无法加载
32位的
System.Data.OracleClient.dll,连应用程序启动都启动不起来。
解决方法:
要么全部用32位来启动,要么全部用64位来启动。
如果要用64位,程序就引用一个64位的
System.Data.OracleClient.dll,并采用方式2的配置。
因为项目原先就用了32位的
System.Data.OracleClient.dll,所以这里只能全部采用32位模式来启动
0、先采用方式1的配置
1、下载32位的oracle客户端:instantclient-basic-win32-11.2.0.1.0.zip,网上一大堆
2、
假设这里解压到:D:\Oracle\instantclient-32(会看到此目录下有一个oci.dll)
3、配置环境变量,在path中加上:
D:\Oracle\instantclient-32(注意放置位置,建议放在最前面,优先从此目录寻找)
4、iisreset,如果不执行此命令,会有缓存(之前的版本不对的oci.dll已经被加载到内存中了)。
5、如果要配置TNS,直接在
D:\Oracle\instantclient-32新建目录:network\admin,然后copy一个tnsnames.ora来,
再
进行配置即可(可能要配置环境变量,但是我本地没配就能用)。