C#程序集绑定重定向 - Newtonsoft.Json

7
我有以下依赖关系:

我的项目A使用:

  1. project_b.dll
  2. Newtonsoft.Json.dll(版本8)

项目B使用:

  1. project_c.dll
  2. Newtonsoft.Json.dll(版本9)

项目C使用:

  1. Newtonsoft.Json.dll(版本4.5)

项目A调用了项目B的一个方法,该方法将调用项目C的一个方法,然后将返回值传回B,再传回A。

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-655535.0.0.0" newVersion="XX" />
</dependentAssembly>

我正在尝试在项目A中使用程序集绑定重定向。如果我将“newVersion”设置为9.0,则代码会抱怨(缺少Newtonsoft.jSon.dll 4.5库)。同样的,如果我将“newVersion”设置为4.5,则会出现缺少Newtonsoft.Json.dll 9.0库的错误。我尝试了“newVersion”值为8.0。看起来很简单,我认为重定向应该解决这个问题。什么是好的解决方案?项目A、B和C是否应该具有相同版本的Newtonsoft.Json.dll?谢谢。

不,在运行时发生。 - Adrian
1
这可能只是一个打字错误吧?XX = "9.0" 不够好,版本号有4个部分。只有一个9.0.1版本,作者通过快速增加主要版本号来提供支持,它的真实[AssemblyVersion]是“9.0.0.0”。寻找更新/重建项目C通常是明智的,但它可能仍然可以工作。 - Hans Passant
你为什么在自己的项目中使用版本8?我尝试创建相同的示例,但在运行时出现异常。但是,如果你将自己项目中的Newtonsoft.json版本更改为9(我已经尝试过),那么我的解决方案就可以正常工作了。你在自己的项目中使用版本8有什么特定的原因吗? - Prasad Telkikar
@Adrian,你有没有机会看一下我之前的评论? - Prasad Telkikar
@HansPassant 抱歉,这只是问题中的一个打字错误。版本号已正确设置。 - Adrian
显示剩余2条评论
2个回答

3
唯一的解决方案是所有库都引用相同的“主”版本(8.*9.*等-第一个数字)。然后,您应该能够使用程序集绑定重定向来修复小于“major”的任何内容,尽管越来越普遍的做法是将程序集版本有效地固定在主要版本上,以避免程序集绑定重定向混乱。
关键点在于,在语义化版本控制下,“major”中的任何更改都应被视为破坏性更改,因此您不应该期望针对不同“major”编译的代码能够正确工作,甚至完全不起作用。
注意:在不同主版本之间使用程序集绑定重定向在技术上是可行的;你只是不能指望它真正起作用。如果确实起作用了:把它当成意外加分。

你们两个都发了同样的解决方案,但我更喜欢更详细的解释。会选择这个作为答案。所以,我会考虑将我的项目从8升级到9。 - Adrian

1

1. 你自己的项目版本号不应低于所引用的版本号,因此在 A 项目中也应使用 9.0 版本。

2. 如果 C 项目使用了较低的版本号,这应该不是问题,但请执行以下操作:

在 csproj 文件的第一个属性组中添加 AutoGenerateBindingRedirects,并删除文件中的所有重定向。

<PropertyGroup>
  [...]
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  [...]
</PropertyGroup>

现在构建项目时应该会生成正确的重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接