Oracle.DataAccess.client部署不起作用

时间:2018-07-26 22:17:38

标签: c# oracle odp.net odac

我要在已经具有特定版本的ODAC Oracle.DataAccess.dll的计算机中部署使用64-bit ODAC 11.2和oracle提供程序的应用程序。

但是我要部署的应用程序使用了较新版本的ODAC 64-bit ODAC 12.2c。在该项目的根目录中,我具有提供程序dll及其依赖项:

  • Oracle.DataAccess.dll
  • OraOps12.dll
  • oci.dll
  • ociw32.dll
  • Oracle.DataAccess.dll
  • orannzsbb12.dll
  • oraocci12.dll
  • oraociei12.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>

1 个答案:

答案 0 :(得分:0)

通常,可以安装多个版本的ODP.NET(Oracle.DataAccess)提供程序。但是,由于不受管理的依赖关系,每次启动使用Oracle驱动程序的应用程序之前,您都必须验证/修改%PATH%环境变量。我认为这不是合适的解决方案。

我会看到三种可能的解决方案。

解决方案1 ​​

从引用中删除版本属性。然后,应用程序将加载计算机上安装的任何ODP.NET版本。

分别在您的*.csproj中。 *.vbproj

编辑对ODP.NET的引用
<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,