IIS链接oracle提示:未能加载文件或程序集 System.Data.OracleClient 或 BadImageFormatException: 试图加载格式不正确的程序

场景:
    系统: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
    方式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来, 进行配置即可(可能要配置环境变量,但是我本地没配就能用)。







posted @ 2016-05-04 10:31  zwwhp  阅读(1055)  评论(0编辑  收藏  举报