2013-06-25 214 views
1

我有一個.NET winforms應用程序,它使用ODP連接到oracle db。 ODP安裝是32位,我正在開發Win 7 64 bit machine的應用程序。我在開發機器上將平臺目標設置爲x86,並且運行正常。 但是,當我在Win Server 2003 64 bit machine測試的應用程序它給了異常Win 7 64位和Win Server 2003上的ODP.NET 32位64位

The type initializer for 'Oracle.DataAccess.Client.OracleCommand' threw an exception.            

UNHANDLED EXCEPTION STACK TRACE:at Oracle.DataAccess.Client.OracleCommand.Dispose(Boolean disposing) 
at System.ComponentModel.Component.Finalize() 

UNHANDLED EXCEPTION SOURCE: Oracle.DataAccess 

UNHANDLED EXCEPTION INNER EXCEPTION: Oracle.DataAccess.Client.OracleException The provider is not compatible with the version of Oracle client at Oracle.DataAccess.Client.OracleInit.Initialize() 
at Oracle.DataAccess.Client.OracleCommand..cctor() 

UNHANDLED EXCEPTION DATA: System.Collections.ListDictionaryInternal 

UNHANDLED EXCEPTION MESSAGE: The type initializer for 'Oracle.DataAccess.Client.OracleCommand' threw an exception. 

當我設定的目標平臺,以Any CPU在Windows 7 64位它提供了異常:

Could not load file or assembly 'Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format. 

ODP版本上開發機器(Win 7 64 bit)是11.2.0,在測試機器上(Win Server 2003 64位)也是11.2.0

我該怎麼做才能在兩臺機器上運行應用程序?任何想法?

+0

有'ORACLE_BASE \ ORACLE_HOME \ odp.net \ bin \ 2.x',但在我的ODP instalaltion下沒有'ORACLE_BASE \ ORACLE_HOME \ odp.net \ bin \ 4'導演。 – gesus

回答

0

IMO有幾個選項:

  1. 編譯爲x86和64位的服務器上安裝32位Oracle客戶端(可以並行運行,如果你改變了ORACLE_HOME,TNS_ADMIN,...系統變量);
  2. 編譯x86並打包所有DLL的32位Oracle Instant Client以及您的二進制文件(確保TNS_ADMIN系統變量已設置,否則您將無法使用LDAP或tnsnames);
  3. 爲任何CPU編譯應用程序,但爲x64和x86位創建一組不同的dll(針對特定體系結構編譯Oracle.DataAcess.dll,針對x64有一個版本,針對x86編譯一個);
  4. Oracle正在致力於a managed Oracle driver,不再需要Oracle客戶端,大多數代碼庫都可以輕鬆轉換,但請注意,它尚未完成功能,只支持Oracle 11+數據庫。
+0

大部分我都同意。 #1不需要對oracle_home或tns_admin進行任何更改 - 提供程序的較新版本首先使用註冊表來定位非託管dll。第二 - #3 - 只需在開發機器上安裝64位版本就足夠了。從那裏你不會將Oracle.DataAccess.dll從機器複製到機器,而是依賴於在GAC中註冊的內容。 –

相關問題