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

C# Assembly Binding Redirects - Newtonsoft.Json

我有以下依赖关系

项目 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 的方法,项目 B 将调用项目 C 的方法,然后 return 值返回给 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?

提前致谢..

唯一具有高于平均水平的工作机会的解决方案是所有库都引用相同的 "major" 版本 图书馆的(8.*9.* 等 - 第一个数字)。然后,您应该能够使用程序集绑定重定向来修复任何小于 "major" 的内容,尽管越来越常见的是看到程序集版本有效地固定在专业上,以避免程序集绑定重定向地狱。

这里的关键点是,在 semver 下,"major" 中的任何更改都应被视为重大更改,因此您不应期望针对不同的 "major" 编译的代码能够正常工作,甚至根本没有。

注意:跨专业使用程序集绑定重定向在技术上是可行的;您只是不应该指望它真的有效。如果是:认为这是意外的收获。

1. 你自己的项目不要比引用的版本低,所以在项目A上也使用9.0。

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

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

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

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