当通过Nuget添加bindingRedirect时,如何防止bindingRedirect中的oldVersion被覆

本文关键字:bindingRedirect 何防止 中的 被覆 oldVersion Nuget 添加 | 更新日期: 2023-09-27 18:12:59

我已经创建了一个依赖于其他第三方程序集的程序集,这些程序集在添加我的程序集时可能在项目引用中,也可能不在项目引用中。因为我的程序集最初是使用第三方依赖项构建的,可能比当前项目中的依赖项更老,所以我需要将bindingRedirects添加到app.config文件中。Stack Overflow的一位同事(在回答我关于是否有可能以某种方式自动修改app.config文件的问题时)建议我考虑通过NuGet分发我的程序集。这原来是一个很好的建议,但我注意到一个奇怪的效果,我不知道我该如何纠正它,如果有的话。

在我的NuGet包的content文件夹中,我有一个app.config.transform文件,表面上是这样的:

<configuration>
 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="C1.Win.C1Ribbon.2" culture="neutral" publicKeyToken="79882d576c6336da"/>
        <bindingRedirect oldVersion="2.0.20141.567" newVersion="Add New Value Here"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

还有其他重定向,但这应该足以让您了解要点。

当我将NuGet包添加到一个项目时,它会加载我的程序集并更改app.config文件,结果,但正如编程经常发生的情况一样,事情似乎从未完全按照计划运行。

如果我提供重定向的程序集之一已经存在于项目中,则对我在NuGet包中提供的原始xml进行一些细微的更改:

<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="C1.Win.C1Ribbon.2" culture="neutral" publicKeyToken="79882d576c6336da" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.20142.582" newVersion="2.0.20142.582" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

您将注意到oldVersion已经完全更改,newVersion已经修改,以反映项目引用中的程序集的当前版本。从我的角度来看,自动更改为newVersion是一个额外的好处,因为它是最终用户不需要做的事情,然而更改为oldVersion是一个完全的灾难,因为项目现在在编译时将抛出错误。

如何防止oldVersion详细信息被覆盖,如果程序集恰好存在,当nuget包被添加到项目中?

当通过Nuget添加bindingRedirect时,如何防止bindingRedirect中的oldVersion被覆

你在这里真的是在错误的轨道上,"oldVersion"属性不是你的问题的根源。问题开始于你依赖别人的库。图书馆的变化,是不可避免的。这样的更改可以并且迟早会破坏您的程序。

库作者确实使用了一个非常糟糕的实践。像"2.0.20142.582"这样的版本号没有意义。它是一个自动生成的版本号。您可以看到这样一个数字,但完全不知道库中的更改可能会产生多大的影响。关于版本号的一个常见抱怨是,许多库作者已经切换到语义版本控制。一个更简单的版本号:x.y.z。其中z的增量只是一个小的维护增量,您不必担心。y的增量会引起你的注意,你会阅读发行说明,看看是否需要修改或改进你自己的代码。x的增量会带来很多麻烦。

Nuget包修补<bindingRedirect>,试图使他们的版本号的变化不破坏你的程序。不可避免的是,由于作者使用了如此糟糕的版本编号方案,他的bindingRedirect毫无意义。他声明他的新库与所有先前版本的库兼容。一个彻头彻尾的谎言,正如你所发现的。

您必须选择是否跳过此库更新。如果您不这样做,那么您可以来修复新版本引起的编译错误。没有别的选择。"oldVersion"属性一点也不重要,您使您的程序与当前版本兼容。您不妨完全删除bindingRedirect,它没有意义。