Устанавливает ли PackageReference и package.lock.json необходимость перенаправления привязки в App.Config - PullRequest
0 голосов
/ 19 февраля 2019

В Nuget теперь мы можем использовать формат PackageReference для зависимостей, а также включать повторяющиеся сборки, используя файлы блокировки

В моем проекте я получаю что-то вроде:

{   "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 и файл блокировки устранят необходимость перенаправления привязки сборки.Но у меня сложилось впечатление, что они все еще необходимы, чтобы избежать указанной ошибки.

Это правильно?Означает ли необходимость обязательной переадресации, что что-то не так с настройкой зависимостей?Зачем нужны перенаправления привязки, если библиотеки указывают, что они будут принимать библиотеки DLL версии, равной или превышающей XYZ?

1 Ответ

0 голосов
/ 19 февраля 2019

Кажется, что System.Net.Http.Formatting.dll требуется Newtonsoft.Json v6.0, и вы получаете сообщение об ошибке, поскольку другой файл определяет версию 12.0.1 для использования.

Может быть, вы можете довести System.Net.Http.Formatting.dll до версии, совместимой с Newtonsoft 12.0.1?

Если вы определяете перенаправления привязки для Newtonsoft, вы заверяете, что CLRсборки совместимы, даже если их внутренние ссылки говорят об обратном.Могут все еще быть проблемы во время выполнения с несовместимыми dll.

...