我要在已经具有特定版本的ODAC Oracle.DataAccess.dll
的计算机中部署使用64-bit ODAC 11.2
和oracle提供程序的应用程序。
但是我要部署的应用程序使用了较新版本的ODAC 64-bit ODAC 12.2c
。在该项目的根目录中,我具有提供程序dll及其依赖项:
一旦部署并运行该应用程序,就会出现以下错误:
无法加载DLL'OraOps12.dll':找不到指定的模块。 (来自HRESULT的异常:0x8007007E)
我不想更新现有的ODAC,因为其他应用程序可能会使用它。
我检查了以下链接中的不同链接:Oracle.DataAccess.Client Dependencies或此链接:Oracle.Dataaccess is in the GAC. Can I control the version I use?,但对我来说不起作用。
我虽然也打算使用托管驱动程序,但是基于此link,它不支持批量复制。
是否有解决此问题的方法?还是我做错了什么?
编辑
我的App.config文件如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.DataAccess.Client"></remove>
<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.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"></add>
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.122.1.0" newVersion="4.122.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
答案 0 :(得分:0)
通常,可以安装多个版本的ODP.NET(Oracle.DataAccess
)提供程序。但是,由于不受管理的依赖关系,每次启动使用Oracle驱动程序的应用程序之前,您都必须验证/修改%PATH%
环境变量。我认为这不是合适的解决方案。
我会看到三种可能的解决方案。
解决方案1
从引用中删除版本属性。然后,应用程序将加载计算机上安装的任何ODP.NET版本。
分别在您的*.csproj
中。 *.vbproj
从
<Reference Include="Oracle.DataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
对此
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
我从未开发过网络服务,但我假设在web.config
文件中是这样:
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.DataAccess.Client"></remove>
<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client"
description="Oracle Data Provider for .NET"
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess"></add>
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
解决方案2
在目标计算机上安装Oracle ODP.NET版本12.2。通常,除非其他应用程序强制使用特定版本,否则这没有问题(请参见How to load specific version of assembly from GAC)。只要安装正确,使用Oracle.DataAccess
的其他应用程序将自动重定向到版本12.2。在上一次安装Oracle 12.2时,未在GAC中安装ODP.NET,但是您可以手动配置它:
对于64位版本:
set Oracle_x64=c:\oracle\product\12.2\Client_x64\odp.net
set OraProvCfg_x64=%Oracle_x64%\bin\4\OraProvCfg.exe
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\2.x\Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\bin\4\Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll
对于32位版本:
set Oracle_x86=c:\oracle\product\12.2\Client_x86\odp.net
set OraProvCfg_x86=%Oracle_x86%\bin\4\OraProvCfg.exe
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\2.x\Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.102.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.111.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.112.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.121.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\2.x\Policy.2.122.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\bin\4\Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.112.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.121.Oracle.DataAccess.dll
"%OraProvCfg_x86%" /action:gac /providerpath:%Oracle_x86%\PublisherPolicy\4\Policy.4.122.Oracle.DataAccess.dll
对于ODP.NET托管驱动程序(仅供参考):
set Oracle_x64=c:\oracle\product\12.2\Client_x64\odp.net
set OraProvCfg_x64=%Oracle_x64%\managed\x64\OraProvCfg.exe
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\common\Oracle.ManagedDataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.121.Oracle.ManagedDataAccess.dll
"%OraProvCfg_x64%" /action:gac /providerpath:%Oracle_x64%\managed\PublisherPolicy\4\Policy.4.122.Oracle.ManagedDataAccess.dll
解决方案3
转到目标计算机并获取Oracle.DataAccess.dll
文件(仅是单个DLL)并将其复制到您的开发计算机上。对此DLL进行引用。运行/部署应用程序时,只要安装正确,您将被自动重定向到版本12.2,