PackageReference和package.lock.json是否在App.Config中删除了绑定重定向的需要

问题描述 投票:0回答:1

在Nuget中,我们现在可以使用PackageReference格式作为依赖项,并使用lock files启用可重复的构建

在我的项目中,我得到了以下内容:

{   "version": 1,   "dependencies": {
".NETFramework,Version=v4.6.1": {
  "System.Reactive": {
    "type": "Direct",
    "requested": "[4.1.2, )",
    "resolved": "4.1.2",
    "contentHash": "QRxhdvoP51UuXZbSzcIiFu3/MCSAlR8rz3G/XMcm3b+a2zOC5ropDVaZrjXAO+7VF04Aqk4MCcLEdhxTfWVlZw==",
    "dependencies": {
      "System.Threading.Tasks.Extensions": "4.5.1",
      "System.ValueTuple": "4.4.0"
    }
  },
  "System.Threading.Tasks.Extensions": {
    "type": "Direct",
    "requested": "[4.5.2, )",
    "resolved": "4.5.2",
    "contentHash": "BG/TNxDFv0svAzx8OiMXDlsHfGw623BZ8tCXw4YLhDFDvDhNUEV58jKYMGRnkbJNm7c3JNNJDiN7JBMzxRBR2w==",
    "dependencies": {
      "System.Runtime.CompilerServices.Unsafe": "4.5.2"
    }
  },
  "Apache.Avro": {
    "type": "Transitive",
    "resolved": "1.7.7.2",
    "contentHash": "4zx8Y5wnavxi57ivpMIon4XAnY0d69e4KoiTkMgy4LcstVUPXqD1YZ+IKl3TV2dzV6PJvYGrsLViN+dAN16yvg==",
    "dependencies": {
      "Newtonsoft.Json": "3.5.0",
      "log4net": "1.2.10"
    }
  },
  "Newtonsoft.Json": {
    "type": "Transitive",
    "resolved": "12.0.1",
    "contentHash": "jmVyoEyk0In8r+AObYQyFKVFm7uSRzE0XSHSbEtBJcZDMV6DqJoyB4FLcHwprPVhAh826so0db3DIKXVnpGoPA=="
  },

因此,我们可以看到我们例如具有冲突的Newtonsoft.Json依赖项。在这种情况下,我相信Apache.Avro的依赖性声明版本必须> = 3.5.0,因此这应该是兼容的。

当NuGet执行其还原时,在应用程序启动时,只解析并使用给定程序集的一个DLL。没有锁文件,我必须在所有csproj文件中使用AutoGenerateBindingRedirects = true。

这会生成熟悉的绑定重定向:oldVersion =“0.0.0.0-4.2.0.0”newVersion =“4.2.0.0”

如果没有这样的重定向,您将获得同样熟悉的错误消息:

2019-02-19 11:24:10.955 [Debug] host_Opened
2019-02-19 11:24:11.058 [Error] Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
2019-02-19 11:24:11.058 [Error]    at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter..ctor()

在启动时。因为依赖项需要一个非常旧的Newtonsoft.Json版本,我们只给它解析版本12.0.1。

我的印象是新的PackageReference和锁定文件将消除对程序集绑定重定向的需要。但我现在的印象是他们仍然需要避免上述错误。

那是对的吗?绑定重定向的必要性是否必然意味着依赖项的设置有问题?当库指定它们将接受等于或高于X.Y.Z的版本的DLL时,为什么需要绑定重定向?

c# nuget assembly-binding-redirect packagereference
1个回答
0
投票

似乎System.Net.Http.Formatting.dll需要Newtonsoft.Json v6.0,并且您得到错误,因为另一个文件定义了要使用的版本12.0.1。

也许你可以将System.Net.Http.Formatting.dll升级到与Newtonsoft 12.0.1兼容的版本?

如果为Newtonsoft定义绑定重定向,则向CLR保证组件是兼容的,即使它们的内部引用另有说明。在运行时使用不兼容的dll时可能仍然存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.