Для контекста я делаю 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!
Когда я пытаюсь использовать CompilerServices.Unsafe версии 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>
<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>
<package id = "System.Runtime.CompilerServices.Unsafe" version = "4.5.3" targetFramework = "net472" />
Точно так же, когда я устанавливаю его на 6.0.0.0, я выполняю те же шаги
<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>
<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>
<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. Результат: Без изменений.
Здравствуйте, @julealgon, именно так Visual Studio 2017 автоматически настраивает проект VSIX. Не могли бы вы уточнить, какие изменения вы предлагаете? Со своей стороны, я попытался заменить ссылки на System.Text.Json в csproj на ProjectReferences (удалив все зависимости библиотеки Json) и получил тот же сбой.
Когда был представлен формат csproj в стиле SDK, был добавлен новый, гораздо более оптимизированный механизм для автоматического разрешения перенаправлений привязки. Я бы порекомендовал изучить это, так как это можно сделать даже для старых фреймворковых проектов без особого влияния. Как только вы используете формат проекта в стиле SDK, я думаю, что проблема исчезнет без необходимости возиться с этими значениями (весь раздел bindingRedirects больше не нужен). Хотя теперь, когда я упоминаю об этом, кажется, что с ним действительно возникают некоторые проблемы для проектов VSIX, в частности.
Кроме того, похоже, что они только что закончили официальную поддержку! Вы можете следить за этим здесь: developercommunity.visualstudio.com/t/…
Обычные решения app.config и перенаправления привязки не работают для расширений Visual Studio (vsix), так как app.config загружается средой выполнения .NET Framework только для приложения (devenv.exe.config), а не для DLL. Я предлагаю вам изучить ProvideBindingRedirectionAttribute и ProvideCodeBaseAttribute. Если вы используете более новую версию VS, я ожидаю, что эти сборки уже поставляются в каталоге «общедоступных сборок» VS, поэтому вам, вероятно, не нужно отправлять их в свой vsix, но VS2017 устарел, поэтому, скорее всего, не имеет их, поэтому вам придется объединить их в свой vsix для этой версии VS.
Ух ты! Это сработало @zivkan. Отвечу на главный вопрос. Спасибо!
Хорошо, «я» понял это (спасибо @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. :)
Разве вы не можете использовать csproj в стиле SDK с элементами
PackageReference
для проекта такого типа? Вам действительно нужно вручную управлять переадресацией привязок?