Невозможно объединить версии транзитивной зависимости пакета NuGet в двух NET стандартных проектах - PullRequest
5 голосов
/ 08 января 2020

Добавление EF Core в NET Стандартный проект представляет переходные версии зависимостей, несовместимые с пакетами NuGet в других проектах

У меня есть решение с несколькими. NET Стандартными проектами 2.0.

Один Проект A использует пакет NuGet Google.Protobuf (3.11.2), который зависит от

System.Memory (4.5.3)
    System.Buffers (4.4.0)
    System.Numerics.Vectors (4.4.0)
    System.Runtime.CompilerServices.Unsafe (4.5.2)

Некоторые другие проекты также зависят от System.Memory и всех использовать те же версии зависимостей .

Другой Проект B использует Microsoft.EntityFrameworkCore (3.1.0) NuGet пакет, который зависит от

System.Memory (4.5.3)
    System.Buffers (4.5.0)
    System.Numerics.Vectors (4.5.0)
    System.Runtime.CompilerServices.Unsafe (4.7.0)

Даже если версия System.Memory (4.5.3) в обоих случаях это зависит от System.Buffers, System.Numerics.Vectors и System.Runtime.CompilerServices.Unsafe, а их версии отличаются.

Когда я запускаю приложение, использующее эти проекты (Microsoft Prism WPF. * Приложение 1051 * Framework 4.8, которое использует Unity Io C) UnityContainer выдает следующее исключение:

System.IO.FileLoadException: «Не удалось загрузить файл или сборку» System.Runtime.CompilerServices.Unsafe, Версия = 4.0.4.1, Культура = нейтральная , PublicKeyToken = b03f5f7f11d50a3a 'или одна из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку.

После поиска решения я добавил это в свой NuGet.Config:

  <config>
    <add key="DependencyVersion" value="Highest" />
  </config>

В обоих %appdata%\Nuget и в папке root .sln файл.

Я также удалил папку %userprofile%\.nuget\packages.

Затем я удалил пакеты NuGet из проектов и снова добавил их, но их зависимости имеют те же версии, что и раньше.

Если я перехожу к «Управлять пакетами NuGet для решения ...» в Visual Studio и выбираю «Консолидировать», он просто говорит «Пакеты не найдены»

Ответы [ 2 ]

4 голосов
/ 13 января 2020

Мне удалось воспроизвести проблему. Я создал две новые .net standard 2.0 projects библиотеки классов.

На первом я добавил EF Core. На втором этапе я добавил Google protobuf.

Обе версии, о которых вы упомянули.

Для ядра EF я создал новый класс, который просто наследуется от DbContext. Для protobuff я просто создал пустой класс. Я не знаком с тем, как его использовать. Я все еще смог повторить проблему.

Я создал console app .net framework 4.7.2, ссылающийся на два вышеупомянутых проекта.

Я создал два класса в Консольном приложении и получил error System.IO.FileLoadException: 'Could not load file or assembly...

Как я это решил.

Я пошел на все три проекта и добавил эту строку в csproj.

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

в группу свойств.

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  </PropertyGroup>

После этого я снова запустился и ошибки не появляется.

Пожалуйста, дайте мне знать ваши результаты. Даже если мое решение не работает для вас. Я считаю, что это хорошая практика.

Цитировать Орен.
"Использование. NET Стандарт требует, чтобы вы использовали PackageReference, чтобы устранить боль, связанную с" большим количеством пакетов ". ", А также правильно обрабатывать переходные зависимости. Хотя вы можете использовать. NET Стандарт без PackageReference, я бы не рекомендовал это."

Также Хансельман упоминает: "Проекты" full "Framework используя более старый формат .csproj, и по умолчанию они используют package.config для управления зависимостями. Более новые проекты могут ссылаться на пакеты как первоклассные ссылки. Поэтому мы должны указать ВСЕМ проектам в этом решении управлять и восстанавливать их пакеты как "PackageReferences . ""

Вот мои источники.

https://www.hanselman.com/blog/ReferencingNETStandardAssembliesFromBothNETCoreAndNETFramework.aspx

https://oren.codes/2017/04/23/using-xamarin-forms-with-net-standard-vs-2017-edition/

Обновлен в соответствии с дополнительной информацией Соммена из выпусков github Престижность до Соммен за предоставление этой дополнительной информации. Также слава Immo Landwerth за предоставление этой информации на GitHub. Я предоставлю так же, как Обходные пути, которые уже существуют на странице Github только для полноты, как рекомендовано OP jinjinov.

Взято из Проблемы с GitHub

Временные решения

Обычные. Net Каркасные проекты

  1. Включение автоматизация c Переадресация связывания в приложении root. Net Framework
  2. Убедитесь, что ваш проект приложения root не использует packages.config, но использует PackageReference для пакетов NuGet. Если вы в настоящее время нет packages.config, просто добавьте, если у вас в данный момент нет ни одного package.config, просто добавьте <RestoreProjectStyle>PackageReference</RestoreProjectStyle> Если у вас есть packages.config, преобразуйте содержимое в ссылки на пакеты в файле проекта. Синтаксис выглядит следующим образом: <PackageReference Include="package-id" Version="package-version" />

ASP. NET веб-приложения и веб-сайты

  1. веб-приложения и веб-сайты не поддерживают автоматизацию c генерация перенаправления привязки. Чтобы разрешить конфликты привязки, вам нужно дважды щелкнуть предупреждение в списке ошибок, и Visual Studio добавит их в ваш файл web.config
  2. В проектах веб-приложений вы должны включить PackageReference, как упомянуто выше. На веб-сайтах нельзя использовать PackageReference, поскольку файл проекта отсутствует. В этом случае вам необходимо установить все пакеты NuGet на свой веб-сайт, от которых зависят любые прямые или косвенные ссылки на проекты.

Модульные тесты проектов

По умолчанию связывание перенаправляет не добавляются в проекты библиотеки классов. Это проблематично c для проектов модульного тестирования, так как они в основном похожи на приложения. Таким образом, в дополнение к тому, что описано в automati c перенаправлениях привязки , вам также необходимо указать GenerateBindingRedirectsOutputType:

<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>

Также есть раздел для обсуждения, который предоставляет больше информации -> обсуждение GitHub

3 голосов
/ 13 января 2020

Да, добро пожаловать в борьбу.

Как PanosKarajohn указал, используя packagereference вместо packages.config помогает в этом. К сожалению, это Vs2017 и выше, и для некоторых из нас это еще не видно.

Проблема на самом деле объясняется в значительной степени здесь: https://github.com/dotnet/announcements/issues/31

Вы Нужно использовать переадресацию для связывания, чтобы перенаправить все номера версий на самый высокий из имеющихся у вас, а затем молиться, чтобы все хорошо сочеталось друг с другом

Я использую пакет Microsoft.aspnetcore.signalR в. net 4.6.1 проекте, и у вас возникают те же проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...