1. 程式人生 > >錯誤: 未能完成程式集的安裝(hr = 0x8007000b),.net程式關於使用Oracle.DataAccess.dll不同版本x86和x64問題,即oracle odp.net 32位/64位版本的問題

錯誤: 未能完成程式集的安裝(hr = 0x8007000b),.net程式關於使用Oracle.DataAccess.dll不同版本x86和x64問題,即oracle odp.net 32位/64位版本的問題

如果你的機器上安裝了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.1Copyright (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 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下 2、然後轉到c:\odp.net下,鍵入命令: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