Для System.Text.Json требуются две разные версии CompilerServices.Unsafe?

Для контекста я делаю VSIX для VS2017, и мне требуется System.Text.JSON для сериализации/десериализации данных. Я использую версию 6.0.0.0 System.Text.JSON.

Если я установил для CompilerServices.Unsafe значение 4.0.4.1 (nuget версии 4.5.3) (с соответствующими перенаправлениями привязки (см. ниже)), я получаю эту ошибку:

Как видите, он запрашивает System.Runtime.CompilerServices.Unsafe версии 6.0.0.0. Используя ILSpy в целевом каталоге, я вижу, что версия System.Runtime.CompilerServices.Unsafe, поставляемая в комплекте, была версии 4.0.4.1, как и ожидалось.

В ответ я поднимаю System.Runtime.CompilerServices.Unsafe до 6.0.0.0 (версия nuget 6.0.0), получаю эту ошибку!

Правильно - теперь хочет версию 4.0.4.1!

Подробности

app.config, .csproj, пакеты.config

...с версией 4.0.4.1

Когда я пытаюсь использовать CompilerServices.Unsafe версии 4.0.4.1, я настраиваю свой проект следующим образом:

  • Я настраиваю app.config с перенаправлением привязки на версию 4.0.4.1.
<dependentAssembly>
        <assemblyIdentity name = "System.Runtime.CompilerServices.Unsafe" publicKeyToken = "b03f5f7f11d50a3a" culture = "neutral" />
        <bindingRedirect oldVersion = "0.0.0.0-4.0.4.1" newVersion = "4.0.4.1" />
</dependentAssembly>
  • Добавляю ссылку на версию 4.0.4.1 на csproj
<Reference Include = "System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
  • Я установил его на 4.5.3 в packages.config.
<package id = "System.Runtime.CompilerServices.Unsafe" version = "4.5.3" targetFramework = "net472" />

...с версией 6.0.0.0

Точно так же, когда я устанавливаю его на 6.0.0.0, я выполняю те же шаги

  • Я настраиваю app.config с перенаправлением привязки на версию 4.0.4.1.
<dependentAssembly>
        <assemblyIdentity name = "System.Runtime.CompilerServices.Unsafe" publicKeyToken = "b03f5f7f11d50a3a" culture = "neutral" />
        <bindingRedirect oldVersion = "0.0.0.0-6.0.0.0" newVersion = "6.0.0.0" />
      </dependentAssembly>
  • Я устанавливаю csproj
<Reference Include = "System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
          <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
  • Я устанавливаю packages.config
<package id = "System.Runtime.CompilerServices.Unsafe" version = "6.0.0" targetFramework = "net472" />

Исправить попытки

Несколько вещей, которые я пробовал:

  • очистить локальный кэш пакетов (т. е. удалить папку с именем «пакеты» в корне решения). Результат: Без изменений.

  • удалить папки bin и obj. Результат: Без изменений.

  • обновление system.text.json до версии 6.0.7 (самая высокая версия основной версии 6.0.0). Результат: Без изменений.

  • обновление system.text.json до версии 7.0.2 (последняя). Результат: Без изменений.

  • понижение версии system.text.json. Результат: Без изменений.

Разве вы не можете использовать csproj в стиле SDK с элементами PackageReference для проекта такого типа? Вам действительно нужно вручную управлять переадресацией привязок?

julealgon 10.04.2023 21:02

Здравствуйте, @julealgon, именно так Visual Studio 2017 автоматически настраивает проект VSIX. Не могли бы вы уточнить, какие изменения вы предлагаете? Со своей стороны, я попытался заменить ссылки на System.Text.Json в csproj на ProjectReferences (удалив все зависимости библиотеки Json) и получил тот же сбой.

Owen 10.04.2023 21:59

Когда был представлен формат csproj в стиле SDK, был добавлен новый, гораздо более оптимизированный механизм для автоматического разрешения перенаправлений привязки. Я бы порекомендовал изучить это, так как это можно сделать даже для старых фреймворковых проектов без особого влияния. Как только вы используете формат проекта в стиле SDK, я думаю, что проблема исчезнет без необходимости возиться с этими значениями (весь раздел bindingRedirects больше не нужен). Хотя теперь, когда я упоминаю об этом, кажется, что с ним действительно возникают некоторые проблемы для проектов VSIX, в частности.

julealgon 10.04.2023 22:44

Кроме того, похоже, что они только что закончили официальную поддержку! Вы можете следить за этим здесь: developercommunity.visualstudio.com/t/…

julealgon 10.04.2023 22:46

Обычные решения app.config и перенаправления привязки не работают для расширений Visual Studio (vsix), так как app.config загружается средой выполнения .NET Framework только для приложения (devenv.exe.config), а не для DLL. Я предлагаю вам изучить ProvideBindingRedirectionAttribute и ProvideCodeBaseAttribute. Если вы используете более новую версию VS, я ожидаю, что эти сборки уже поставляются в каталоге «общедоступных сборок» VS, поэтому вам, вероятно, не нужно отправлять их в свой vsix, но VS2017 устарел, поэтому, скорее всего, не имеет их, поэтому вам придется объединить их в свой vsix для этой версии VS.

zivkan 11.04.2023 11:16

Ух ты! Это сработало @zivkan. Отвечу на главный вопрос. Спасибо!

Owen 11.04.2023 15:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, «я» понял это (спасибо @zivkan за то, что указал мне правильное направление 😊). Вместо использования стиля перенаправления привязки app.config (который не работает для VSIX) вы можете вместо этого использовать ProvideBindingRedirectionAttribute.

Я эту строку в мой AssemblyInfo.cs:

[assembly: ProvideBindingRedirection(AssemblyName = "System.Runtime.CompilerServices.Unsafe",
      NewVersion = "6.0.0.0", OldVersionLowerBound = "1.0.0.0",
      OldVersionUpperBound = "4.0.4.2")]

...и, как по волшебству, это просто работает.

Смотрите также:

Привет, Оуэн, поскольку вы нашли правильный способ решения этой проблемы, вы можете принять его как ответ, это поможет другим, когда они будут искать аналогичную проблему в stackoverflow. :)

Bowman Zhu-MSFT 21.04.2023 11:29

Другие вопросы по теме