Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止通过Nuget添加bindingRedirect时覆盖bindingRedirect中的旧版本_C#_.net_Vb.net_Visual Studio 2013_Nuget Package - Fatal编程技术网

C# 如何防止通过Nuget添加bindingRedirect时覆盖bindingRedirect中的旧版本

C# 如何防止通过Nuget添加bindingRedirect时覆盖bindingRedirect中的旧版本,c#,.net,vb.net,visual-studio-2013,nuget-package,C#,.net,Vb.net,Visual Studio 2013,Nuget Package,我创建了一个程序集,该程序集依赖于其他第三方程序集,这些程序集在添加程序集时可能在项目引用中,也可能不在项目引用中。由于我的程序集最初是使用第三方依赖项构建的,这些依赖项可能比当前项目中的依赖项旧,因此我需要将绑定重定向添加到app.config文件中。另一位堆栈溢出贡献者(在回答我关于是否可能以某种方式自动修改app.config文件的问题时)建议我考虑通过NuGet分发我的程序集。这原来是一个很好的建议,但我注意到了一个奇怪的影响,我不知道如何纠正它,如果有的话 在我的NuGet软件包的co

我创建了一个程序集,该程序集依赖于其他第三方程序集,这些程序集在添加程序集时可能在项目引用中,也可能不在项目引用中。由于我的程序集最初是使用第三方依赖项构建的,这些依赖项可能比当前项目中的依赖项旧,因此我需要将绑定重定向添加到app.config文件中。另一位堆栈溢出贡献者(在回答我关于是否可能以某种方式自动修改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>

您会注意到,旧版本已经完全更改,新版本已经修改,以反映项目引用中程序集的当前版本。在我看来,对新版本的自动更改是额外的好处,因为最终用户不需要这样做,但是对旧版本的更改是一场彻底的灾难,因为项目现在在编译时会抛出错误


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

您在这里真的走错了方向,“oldVersion”属性不是问题的根源。麻烦是你依赖别人的图书馆引起的。图书馆的变化是不可避免的。这样的改变迟早会破坏你的计划。在这种情况下更快

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

Nuget软件包修补
,试图使其版本号更改不会破坏您的程序。有点不可避免,因为作者使用了如此糟糕的版本编号方案,他的绑定重定向毫无意义。他说他的新图书馆与他图书馆的所有以前版本兼容。正如你发现的,完全是谎言


您必须选择是否跳过此库更新。如果没有,则必须修复新版本导致的编译错误。没有两条路可走。“oldVersion”属性根本不重要,您已使程序与当前版本兼容。您不妨完全删除bindingRedirect,它没有任何意义。

解决这个问题的一个方法是,目前我唯一能想到的方法是在bindingRedirect行上方添加一条注释行,指出旧版本应该是什么。这就是我目前所做的,但我仍然想知道为什么它会被重置,以及可以做些什么来避免它。Hans,你说得很对,问题是从依赖第三方开始的,但是我的程序集旨在“增加价值”,如果你喜欢他们程序集的一个方面。因此,一种依赖性将一直存在。然而,纯粹为了澄清,他们的版本号是结构化的。我真诚地感谢你在回答我提出的问题时为我提供的帮助。我想我和其他人一样被自己缺乏知识所困扰,但我们还应该如何学习呢?