将绑定重定向添加到每个app.config

问题描述:

我在解决方案文件中有20个项目。其中1个项目是所有项目参考的标准库项目。将绑定重定向添加到每个app.config

大约一年前,我们添加了一个新的nuget包,我们将其称为Package A版本5.0.0.0。它有一堆文件,它们在我们编译时会转移到全部,但我们最终会处理它。我们将该包添加到我们的标准库项目(另一个参考文献19)。

我是新来的Nuget(所以也许我做错了什么),所以我做了一个新的包,作为Package A的帮手。我已经设置了一切,以便助手依赖于Package A版本3.0.0.0到5.0.0.0(所以它适用于其他版本低于我们的版本)。让我们打电话给这个新套餐Package A helper

我安装了Package A helper,一切正常。我去做一个拉请求,并在我们的解决方案的每一个的app.config现在有

<runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
       <dependentAssembly> 
         <assemblyIdentity name="Package.A" publicKeyToken="8FC3CCAD86" culture="neutral"/> 
         <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/> 
       </dependentAssembly> 
     </assemblyBinding> 
</runtime> 

它将编译罚款没有它,但视觉工作室抱怨并给出了一个警告。是什么赋予了?我的经理现在不让我合并我的代码,因为它在app.config中添加了太多的噪音,并且依赖于套餐A太多。

为什么添加一个依赖于Package A的nuget包,然后必须有这个新的bindingRedirect当我们安装Package A Helper之前主要的依赖已经满足了?

为什么它会说0.0.0.0-5.0.0.0当我在NuGet包和package.config指定3.0.0.0-5.0.0.0

更新:

当我建立Package A helper与引用到Package A版本5.0.0.0,那么所有bindingRedirects都不会在每个app.config中自动填充,而是会生成警告。我最初使用3.0.0.0构建它,因为我认为最好是用最低的依赖关系来构建它。问题仍然存在,因为visual studio仍然警告并且建议bindingRedirects被创建。

No way to resolve conflict between "Package A, Version=5.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33" and "Package A, Version=3.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33". Choosing "Package A, Version=5.0.0.0, Culture=neutral, PublicKeyToken=83hfhsd33" arbitrarily. 
Consider app.config remapping of assembly "Package A, Culture=neutral, PublicKeyToken=83hfhsd33" from Version "3.0.0.0" [] to Version "5.0.0.0" [path to Package A dll] to solve conflict and get rid of warning. 

是解决只是改变从3.0.0.0我的NuGet包依赖关系5.0.0.0,只是允许5.0.0.0和我摆脱我allowedVersions="[3,6)" packages.config?我不想减少nuget包的帮助和向后兼容性,但同时我不需要警告或绑定我的主要解决方案所需的引导。

更新2:所以设置Copy Local在参考属性False实际上解决了我的问题,但我不明白为什么。

+0

请问您可以添加关于您所看到的警告的详细信息吗? –

+0

@SimonMᶜKenzie他们被添加了。 – LearningJrDev

我原本有3.0.0.0建造它,因为我想这是最好的......

这就是问题开始的地方。您的解决方案现在取决于两个两个不同版本的A.dll,一个将覆盖另一个。 A.dll的哪个版本最终被复制到bin \ Debug中是随机的。无论什么项目最后建成。

这不能很好地结束,解决方案注定要失败执行。如果将成为A-helper.dll中的代码,则当5.0.0.0版本最终被复制时它将失败。或者它将成为任何其他项目使用的代码A.dll,它将在3.0.0.0版本被复制时失败。最终结果是解决方案将始终失败。

所以你看到构建系统正在做一些事情。它注意到这个差异,并选择其中一个版本来赢。它选择5.0.0.0,这是正确的选择。它也修改app.config,添加bindingRedirect,因此要求加载3.0.0.0版本的代码实际上会得到5.0.0.0。 可能工作,如果你使版本5与版本3兼容。或者不是,主要版本号中的两个增量通常会带来麻烦。你会发现什么时候你测试。

所以设置复制本地的参考属性设置为False实际上解决了我的问题

相信没有解决不了的问题,你只是从假设它应该解决这个问题为您防止构建系统。由于不再需要复制DLL,因此它会推测您将在GAC中安装程序集,以便两个版本可以共存。也许你做过了,这在开发机器上这样做并不常见,而且一般来说非常不明智。鉴于额外的安装步骤,您的老板和团队成员不太可能会喜欢这种解决方案。


因此有两个基本的东西,你可以这样做:

  • 让构建系统排序了这一点。正如它那样,它正确地解决了问题,并且您的解决方案将工作。如果版本5与版本3兼容,那么A-helper.dll中的代码甚至可以正确执行。如果老板不喜欢它,那么你当然必须从头开始做这件事:

  • 将A-helper项目中的引用更改为A版本5.0.0.0。现在不再有任何不兼容性,唯一的A.dll对所有代码都有好处。根据您的要求,这是您的老板会喜欢的唯一解决方案。

+0

我最终用A helper中的版本5进行编译,然后添加一个安装powerscript,将复制本地设置为false。这没有任何警告(也是版本3和5是不好的例子,真正的版本是在一个主要版本)。 我很好奇,虽然现在已经编译了版本5,我试图用版本3创建一个新项目,尽管我说它只需要3+,但它不会工作。这就是为什么我编译版本3,使版本3的人可以使用插件。 – LearningJrDev