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

Posted

技术标签:

【中文标题】C# 程序集绑定重定向 - Newtonsoft.Json【英文标题】:C# Assembly Binding Redirects - Newtonsoft.Json 【发布时间】:2019-12-21 04:58:25 【问题描述】:

我有以下依赖

项目 A(由我拥有)使用

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

项目B使用

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

项目C使用

    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 库错误。我也尝试了 8.0 的 'newVersion' 值。它看起来很简单,我认为重定向应该可以解决问题。什么是好的解决方案?项目 A、B 和 C 是否应该具有相同版本的 Newtonsoft.Json.dll?

提前谢谢..

【问题讨论】:

这是编译时错误吗?如果是这样,这可能会有所帮助***.com/questions/21498074/… 不,在运行时发生 所以这可能只是一个错字? XX = "9.0" 不够好,版本号有 4 个部分。曾经只有一个 9.0.1 版本,作者通过快速增加主要版本号来提供支持,其真正的 [AssemblyVersion] 是“9.0.0.0”。不言而喻,寻找更新/重建项目 C 往往是明智的,但它可能无论如何都会起作用。 为什么在自己的项目中使用版本 8?我尝试创建相同的示例,它在运行时给出异常,但是如果您将自己的项目 Newtonsoft.json 版本更改为 9(我试过这个),对我来说解决方案工作正常。在您自己的项目中使用版本 8 是否有任何具体原因。 @Adrian,你有没有机会查看我之前的评论 【参考方案1】:

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

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

注意:技术上可以跨专业使用程序集绑定重定向;你只是不应该期望它真正起作用。如果确实如此:认为这是一个意想不到的好处。

【讨论】:

你们俩都发布了相同的解决方案,但我喜欢更详细的解释。将选择这个作为答案。所以,会考虑将我的项目从 8 升级到 9。【参考方案2】:

1. 您自己的项目的版本不应低于引用的版本,因此在项目 A 上也要使用 9.0。

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

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

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

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

【讨论】:

以上是关于C# 程序集绑定重定向 - Newtonsoft.Json的主要内容,如果未能解决你的问题,请参考以下文章

程序集绑定重定向不起作用

依赖程序集绑定重定向

xml 在gac级别重定向程序集绑定

Powershell - 在应用程序配置文件中找不到程序集绑定重定向

如何使用 C# 正确准备“HTTP 重定向绑定”SAML 请求

运行时无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,间接依赖程序集继续寻找旧版本