C#程序集重定向

时间:2018-03-12 10:23:48

标签: c# redirect configuration version .net-assembly

我正在使用Oracle.DataAccess,并且需要访问较旧的数据库,这意味着我需要使用此程序集的旧版本。新旧程序集都在GAC中,但我似乎无法让应用程序使用旧版本。这是我的.config文件:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
        <bindingRedirect oldVersion="2.121.1.0" newVersion="2.112.3.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

fuslogvw没有显示任何内容(没有任何内容,完全是空的),但我对这个工具并不太熟悉,所以也许我也使用了那个错误(也是)。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您的配置文件看起来正确。但我会将旧版本改为此版本 0.0.0.0-2.999.9.0。因为那时你并不关心Oracle dll的实际版本是什么,而新版本是你想要使用的正确(旧)版本。

现在你确定这是正确的版本吗? Oracle.DataAccess的第2版很糟糕。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342"/>
        <bindingRedirect oldVersion="0.0.0.0-2.999.9.0" newVersion="2.112.3.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

以下是来自MS的更多信息 https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/bindingredirect-element

答案 1 :(得分:0)

  

我需要使用这个程序集的旧版本。

这不是程序集重定向的用途。程序集绑定重定向的目的是,您可以使用程序集的较新版本,该程序集是针对旧版本编译的程序集的依赖项。

例如,您的应用取决于LibraryXLibraryX取决于LibraryY 1.0版。

YourApp -> LibraryX (v3.2) -> LibraryY (v1.0)

为了论证,您的应用程序需要直接使用LibraryY的2.0版本。

YourApp -> LibraryX (v3.2) -> LibraryY (v1.0)
        -> LibraryY (v2.0)

由于您的应用程序在编译时使用的LibraryY版本比LibraryX更新,因此无法正常工作。

因此,我们添加了一个绑定重定向,强制LibraryX使用与YourApp相同的版本。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="LibraryY" publicKeyToken="89b483f429c4fecd"/>
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

将其更改为:

YourApp -> LibraryX (v3.2) -> LibraryY (v2.0)
        -> LibraryY (v2.0)

你的案例

如果要在应用程序中使用旧版本的程序集,则需要在应用程序中引用旧版本。使用绑定重定向无法解决此问题,只能使用对应用程序需要使用的Oracle.DataAccess特定版本的直接程序集引用。

在您的应用程序的.csproj文件中:

<ItemGroup>
    <Reference Include="Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
        <SpecificVersion>True</SpecificVersion>
        <HintPath>C:\Windows\assembly\GAC_32\Oracle.DataAccess\2.121.1.0__89b483f429c47342\Oracle.DataAccess.dll</HintPath>
    </Reference>
<ItemGroup>
  

请注意,我不确定Oracle.DataAccess是x86还是x64 GAC参考,因此如果是后者,您可能需要同时更改上面的processorArchitectureHintPath

参考:Redirecting Assembly Versions