错误: 未能完成程序集的安装(hr = 0x8007000b),.net程序关于使用Oracle.DataAccess.dll不同版本x86和x64问题,即oracle odp.net 32位/64位版本的问题
程序员文章站
2022-08-28 15:20:43
如果你的机器上安装了odp.net,且确信machine.config也有类似以下结节:(64位+.net 4.0环境下,machine.config可能会有4份,分别对应于.net2.0/4.0的32/64位版本,要每个都检查过去哦)
表明你的机器上安装了4个版本的oracle.dataaccess,分别对应于.net 2.0以及.net 4.0的32位/64位版本
注:在这个界面上,只能看到2.112.2.0与4.112.2.0二个版本号,体现不出x86/x64的区别。
如果你的机器上安装了odp.net,且确信machine.config也有类似以下结节:(64位+.net 4.0环境下,machine.config可能会有4份,分别对应于.net2.0/4.0的32/64位版本,要每个都检查过去哦)
< dbproviderfactories >
< add name="oracle data provider for .net" invariant="oracle.dataaccess.client" description="oracle data provider for .net" type="oracle.dataaccess.client.oracleclientfactory, oracle.dataaccess, version=2.111.7.20, culture=neutral, publickeytoken=89b483f429c47342"/>
</ dbproviderfactories >
|
4.0的machine.config中类似下面这样:
1
2
3
|
< dbproviderfactories >
< add name="oracle data provider for .net" invariant="oracle.dataaccess.client" description="oracle data provider for .net" type="oracle.dataaccess.client.oracleclientfactory, oracle.dataaccess, version=4.112.2.0, culture=neutral, publickeytoken=89b483f429c47342" />
</ dbproviderfactories >
|
如果碰巧您又在用64位的操作系统(比如win2008 r2),开发工具又是最先进的vs.net 2010 sp1,但是死活在代码就是连接不上oracle,一直报一些奇怪的错误:比如“data provider找不到”啦,“oracle.dataaccess.client无法加载”啦之类,正在一筹莫展大声咆哮:“天理,有木有啊,有木有!”之时,恭喜你,多半是遇到了x64/x64的版本问题。
odp.net安装后,默认会在gac中部署程序集oracle.dataaccess,如果你安装的是x86版本,gac中的就是x86;如果你安装的x64版本,gac中的就是amd64版本。
检测本机gac中是否有oracle.dataaccess程序集并查看版本的方法如下:
在vs.net命名行窗口下,输入gacutil.exe /l oracle.dataaccess
如果看到类似下面的结果:
d:\app\x86\microsoft visual studio 10.0\vc>gacutil.exe /l oracle.dataaccess
microsoft (r) .net global assembly cache utility. version 4.0.30319.1
copyright (c) microsoft corporation. all rights reserved.
copyright (c) microsoft corporation. all rights reserved.
the global assembly cache contains the following assemblies:
oracle.dataaccess, version=2.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=amd64
oracle.dataaccess, version=2.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=x86
oracle.dataaccess, version=4.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=amd64
oracle.dataaccess, version=4.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=x86
oracle.dataaccess, version=2.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=amd64
oracle.dataaccess, version=2.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=x86
oracle.dataaccess, version=4.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=amd64
oracle.dataaccess, version=4.112.2.0, culture=neutral, publickeytoken=89b483f429c47342, processorarchitecture=x86
number of items = 4
表明你的机器上安装了4个版本的oracle.dataaccess,分别对应于.net 2.0以及.net 4.0的32位/64位版本
而且在c:\windows\assembly 目录下也能看到x86与amd64位
注:在资源管理器里,只能看到2.112.2.0的x86/amd64版本,看不到4.112.2.0版本的任何东东(不知道是不是我的个别现象,也有可能另外的版本在其它地方,我没找到)
如果缺少相关的版本,可以先到oracle官网download,下面以64位odp.net为例:
我客户端安装的是oracle 11 32位客户端,如果64位开发程序使用32位的oracle.dataaccess.dll会报如标题异常.
所以我要下载64位的odp.net(odac112040xcopy_64bit.zip)
1、下载完成后,将其解压到某个目录,比如e:\software\oracle11g\odp.net,然后键入以下cmd的dos命令:
e:\software\oracle11g\odp.net\x64>install.bat all c:\odp.net myhome (install all components)
上述命令将自动把所有文件复制到c:\odp.net下
e:\software\oracle11g\odp.net\x64>install.bat all c:\odp.net myhome (install all components)
上述命令将自动把所有文件复制到c:\odp.net下
2、然后转到c:\odp.net下,键入命令:
c:\odp.net>configure.bat all myhome (configure all component)
c:\odp.net>configure.bat all myhome (configure all component)
将自动向gac中部署相应的程序集.
然后在vs2010里,添加引用时,应该就能看到oracle.dataaccess的二个版本
注:在这个界面上,只能看到2.112.2.0与4.112.2.0二个版本号,体现不出x86/x64的区别。
贴一段示例代码:
总之一句话:要跑64位的.net程序,就必须用64位的odp.net,要跑32位的.net程序,就必须用32位的odp.net,且machine.config中要有相应的provider节点。
最后给出odp.net32位与64位的下载地址:
64位下载地址
32位下载地址
参考阅读
http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html
上一篇: SQLServer之创建LOGON触发器
下一篇: 官宣,逗B们都脱单了