PackageReference 和 package.lock.json 是否消除了 App.Config 中绑定重定向的需要
Does PackageReference and package.lock.json remove the need for Binding Redirects in App.Config
在 Nuget 中我们现在可以使用 PackageReference format for dependencies and also enable repeatable builds using 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。没有锁定文件我不得不使用
AutoGenerateBindingRedirects=true 在所有 csproj 文件中。
这会生成熟悉的绑定重定向: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 时,为什么绑定重定向是必要的?
似乎 System.Net.Http.Formatting.dll 需要 Newtonsoft.Json v6.0,您收到错误消息是因为另一个文件定义了要使用的版本 12.0.1。
也许您可以将 System.Net.Http.Formatting.dll 升级到与 Newtonsoft 12.0.1 兼容的版本?
如果您为 Newtonsoft 定义绑定重定向,您就可以向 CLR 保证程序集是兼容的,即使它们的内部引用另有说明。不兼容的 dll 在运行时可能仍然存在问题..
在 Nuget 中我们现在可以使用 PackageReference format for dependencies and also enable repeatable builds using 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。没有锁定文件我不得不使用 AutoGenerateBindingRedirects=true 在所有 csproj 文件中。
这会生成熟悉的绑定重定向: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 时,为什么绑定重定向是必要的?
似乎 System.Net.Http.Formatting.dll 需要 Newtonsoft.Json v6.0,您收到错误消息是因为另一个文件定义了要使用的版本 12.0.1。
也许您可以将 System.Net.Http.Formatting.dll 升级到与 Newtonsoft 12.0.1 兼容的版本?
如果您为 Newtonsoft 定义绑定重定向,您就可以向 CLR 保证程序集是兼容的,即使它们的内部引用另有说明。不兼容的 dll 在运行时可能仍然存在问题..