【问题标题】:C# assembly redirectionC# 程序集重定向
【发布时间】:2018-03-12 10:23:48
【问题描述】:

我正在使用 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 什么都没有显示(就像什么都没有,完全是空的),但我对这个工具不太熟悉,所以也许我使用了错误的(也)。

有什么想法吗?

【问题讨论】:

  • do this了吗?
  • 您确定您的版本号正确吗?旧版本号2.121.1.0 看起来比新版本号2.112.3.0
  • 但这不是应该的样子吗?如果我有 .dll 的 v2 和 v1,但想要绑定到 v1 而不是默认的 v2,那么我设置 oldVersion=v2 和 newVersion=v1 来告诉我的应用程序使用 v1?

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


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    例如,您的应用程序依赖于LibraryX,而LibraryX 依赖于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

    【讨论】:

    • 根据 Microsoft 文档,它声明 newVersion 可以是早期版本?
    • 显然如此。见Redirecting Assembly Versions。但如果可以的话,最好只针对旧版本进行编译。
    猜你喜欢
    • 2019-12-21
    • 2020-05-12
    • 2012-04-27
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多