Visual Studio 2010适配Oracle客户端11.2.0.4的问题咨询
问题解答:Oracle客户端版本切换引发的Oracle.DataAccess加载错误
一、为什么卸载重装不同Oracle版本会引发这个问题?
这个错误(尤其是incorrect format提示)本质是Oracle.DataAccess组件与Oracle客户端强绑定、残留资源冲突导致的:
- Oracle.DataAccess.dll是Oracle客户端的核心.NET驱动,它和客户端的版本、32/64位必须完全匹配,跨版本混用必然出问题。你卸载11.2.0.1安装11.2.0.4后,旧版本的驱动可能还残留在GAC(全局程序集缓存)、项目bin目录或者系统配置里。
incorrect format通常是位数不匹配:比如项目编译目标是x86,但你装了64位Oracle客户端,反之亦然。Oracle驱动分32/64位,位数不对的话CLR会直接报格式错误。- 另外,Oracle客户端卸载不彻底(比如残留
ORACLE_HOME环境变量、注册表HKEY_LOCAL_MACHINE\SOFTWARE\Oracle键值),也会让程序误加载旧路径的驱动。
二、设置为“非版本特定”,Visual Studio还会存储引用的DLL吗?
这里要纠正一个常见误解:
- 勾选“非版本特定”只是告诉VS不强制绑定某一个具体版本号,但它不会自动把DLL存储到项目本地——除非你把引用的
复制本地属性设为True。 - 如果
复制本地是默认的False,VS会优先从GAC加载Oracle.DataAccess,其次是系统的Oracle客户端目录。这时候如果GAC里还留着旧版本驱动,哪怕你装了新版本,程序还是可能加载旧的,因为GAC的优先级远高于本地目录。 - 只有当
复制本地设为True时,VS才会把引用的DLL复制到项目bin目录,这时候程序会优先加载本地DLL,但前提是这个本地DLL是对应新版本的(如果之前复制的是旧版本,还是会出问题)。
三、卸载Oracle客户端并清除GAC中的Oracle相关引用后重装,能否解决问题?
大概率可以,但必须保证卸载和重装的彻底性,按以下步骤操作:
- 彻底卸载旧Oracle客户端:
- 用Oracle官方的卸载工具(Oracle Universal Installer)完成卸载,不要直接删除文件夹。卸载后检查
ORACLE_HOME环境变量是否删除,HKEY_LOCAL_MACHINE\SOFTWARE\Oracle和HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Oracle下的注册表项是否清空。
- 用Oracle官方的卸载工具(Oracle Universal Installer)完成卸载,不要直接删除文件夹。卸载后检查
- 清除GAC中的旧Oracle驱动:
- 以管理员身份打开Visual Studio命令提示符,执行命令删除GAC中的旧驱动:
如果有多个版本残留,需要指定版本号精准删除,比如:gacutil /u Oracle.DataAccessgacutil /u Oracle.DataAccess,Version=11.2.0.1.0,Culture=neutral,PublicKeyToken=89b483f429c47342
- 以管理员身份打开Visual Studio命令提示符,执行命令删除GAC中的旧驱动:
- 重装对应位数的Oracle客户端11.2.0.4:
- 一定要和项目编译目标平台一致:项目是x86就装32位客户端,是x64就装64位。重装时默认会把新版本的Oracle.DataAccess注册到GAC。
- 检查项目设置:
- 右键项目引用里的Oracle.DataAccess,确认
复制本地设为False(依赖GAC)或者True(若需要本地DLL,要确保bin目录里是新版本的DLL);同时确认项目的目标平台(右键项目→属性→生成→平台目标)和客户端位数完全匹配。
- 右键项目引用里的Oracle.DataAccess,确认
完成这些步骤后,再运行项目,应该就能正常加载新版本的Oracle.DataAccess了。
内容的提问来源于stack exchange,提问作者Jerry Warra
相关产品推荐
相关产品推荐

