C# 正在将绑定重定向添加到每个app.config

C# 正在将绑定重定向添加到每个app.config,c#,visual-studio,nuget,assemblybinding,assembly-binding-redirect,C#,Visual Studio,Nuget,Assemblybinding,Assembly Binding Redirect,我在一个解决方案文件中有20个项目。其中1个项目是所有项目都引用的标准库项目 大约一年前,我们添加了一个新的nuget软件包,我们称之为PackageAVersion5.0.0.0。它有一堆文件,当我们编译时,它会到处传输,但我们最终处理了它。我们将这个包添加到我们的标准库项目中(另一个是19个参考) 我是Nuget的新手(所以可能我做错了什么),所以我制作了一个新包作为包a的助手。我已经设置好了所有内容,使助手依赖于包a版本3.0.0.0到5.0.0.0(因此它适用于版本低于我们的其他人)。让

我在一个解决方案文件中有20个项目。其中1个项目是所有项目都引用的标准库项目

大约一年前,我们添加了一个新的nuget软件包,我们称之为
PackageA
Version5.0.0.0。它有一堆文件,当我们编译时,它会到处传输,但我们最终处理了它。我们将这个包添加到我们的标准库项目中(另一个是19个参考)

我是Nuget的新手(所以可能我做错了什么),所以我制作了一个新包作为
包a
的助手。我已经设置好了所有内容,使助手依赖于
包a
版本3.0.0.0到5.0.0.0(因此它适用于版本低于我们的其他人)。让我们将此新包称为帮助程序包

我安装了
包一个助手
,一切都正常工作。我去做一个拉取请求,我们解决方案中的每个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>
解决方案是否只是将我的nuget软件包依赖项从3.0.0.0更改为5.0.0.0,只允许5.0.0.0并删除我的
allowedVersions=“[3,6)”
in me packages.config?我不想降低nuget软件包的帮助性和向后兼容性,但同时我不希望主解决方案需要警告或绑定重定向

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

我最初是用3.0.0.0构建的,因为我认为它是最好的

问题就是从这里开始的。您的解决方案现在依赖于.dll的两个不同版本,一个版本将覆盖另一个版本。哪个版本的.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版本的代码实际上将获得5.0.0.0。如果您需要,这可能会起作用e版本5是否与版本3足够兼容。或者不兼容,主版本号的两个增量通常意味着麻烦。您将在测试时发现

因此,将引用属性中的Copy Local设置为False实际上解决了我的问题

这并没有解决问题,您只是阻止了构建系统假设它应该为您解决此问题。因为它不再需要复制DLL,它猜测您将在GAC中安装程序集,以便两个版本可以共存。可能是您这样做的,在开发机器上这样做并不常见,通常是非常不明智的。考虑到额外的安装步骤,您的上司和团队成员不太可能喜欢此解决方案


因此,您可以做两件基本的事情:

  • 让构建系统来解决这个问题。正如它所做的那样,它正确地解决了问题,您的解决方案也会起作用。如果版本5与版本3足够兼容,那么A-helper.dll中的代码甚至会正确执行。如果老板不喜欢它,那么您当然必须对此进行修改并执行以下操作:

  • 将A-helper项目中的引用更改为版本5.0.0.0。现在不再存在任何不兼容,唯一的A.dll适用于所有代码。根据您的要求,这是您的上司唯一喜欢的解决方案


您可以添加有关您看到的警告的详细信息吗?@SimonMᶜKenzie他们被添加了。我最终在助手中使用版本5进行编译,然后添加了一个将copy local设置为false的install powerscript。这没有发出任何警告(版本3和5也是错误的示例,真实版本在主版本中).我很好奇,虽然现在它是用版本5编译的,但我试着用版本3创建一个新项目,尽管我说它只需要3+,但它还是不起作用。这就是为什么我用版本3编译,以便使用版本3的人可以使用插件的原因。
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.