我有一个.NET winforms
应用程序,它使用ODP
连接到oracle数据库。ODP安装是32位的,我正在Win 7 64 bit machine
上开发应用程序。我在开发机器上将平台目标设置为x86,它运行良好。但当我在Win Server 2003 64 bit machine
上测试应用程序时,它给出了异常
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.
当我在Windows 7 64位上将平台目标设置为Any CPU
时,会出现异常:
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位)是11.2.0
,测试机器上的(Win Server 2003 64位)也是11.2.0
我应该怎么做才能在两台机器上运行应用程序?知道吗?
IMO有几个选项:
- 编译x86并在64位服务器上安装32位Oracle客户端(如果更改Oracle_HOME、TNS_ADMIN…系统变量,则可以并行运行)
- 为x86编译,并将32位Oracle Instant Client的所有DLL与二进制文件打包在一起(确保设置了TNS_ADMIN系统变量,否则您将无法使用LDAP或tnsnames)
- 为任何CPU编译应用程序,但为x64和x86位创建一组不同的dll(Oracle.DataAcess.dll是为特定体系结构编译的,有一个x64版本和一个x86版本)
- Oracle正在开发一个托管的Oracle驱动程序,不再需要Oracle客户端,大多数代码库都可以轻松转换,但请注意,它的功能还不完整,只支持Oracle 11+数据库