Как решить проблемы с версией сборок в Xamarin android?

Я потратил 2 дня на поиски в Google, пытаясь разрешить конфликтную ситуацию с управлением версиями dll в Xamarin. Я видел много сообщений с одинаковыми проблемами (просто разные пакеты NuGet), но, как я видел, нигде не было конкретного решения. Я постараюсь здесь кратко резюмировать.

Я использую Xamarin для Android (не Xamarin Forms). Этот проект ссылается на мой проект .NET Standard 2.0 (.NET Core), который содержит всю базовую логику. Я установил Automapper через NuGet в свой основной проект, и внезапно у меня появляется предупреждение о сборке, описывающее конфликт. Конфликт заключается в том, что Xamarin для Android (Mono) использует Microsoft.Csharp.dll версии 2.0.5.0, а Auto mapper, который находится в упомянутом проекте Core, использует Microsoft.Csharp.dll 4.0.0.0.

Вот результат процесса сборки, связанный с упомянутым:

    There was a conflict between "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" and "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". (TaskId:131)
2>      "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was chosen because it was primary and "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" was not. (TaskId:131)
2>      References which depend on "Microsoft.CSharp, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" [C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll]. (TaskId:131)
2>          C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll (TaskId:131)
2>            Project file item includes which caused reference "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid\v1.0\Microsoft.CSharp.dll". (TaskId:131)
2>              Microsoft.CSharp (TaskId:131)
2>      References which depend on "Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" []. (TaskId:131)
2>          C:\Users\missa\.nuget\packages\automapper\7.0.1\lib\netstandard2.0\AutoMapper.dll (TaskId:131)
2>            Project file item includes which caused reference "C:\Users\missa\.nuget\packages\automapper\7.0.1\lib\netstandard2.0\AutoMapper.dll". (TaskId:131)         C:\Users\missa\.nuget\packages\automapper\7.0.1\lib\netstandard2.0\AutoMapper.dll (TaskId:131)
2>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2110,5): warning MSB3277: Found conflicts between different versions of "Microsoft.CSharp" that could not be resolved.  These reference conflicts are listed in the build log when log verbosity is set to detailed.

Итак, процесс сборки выбрал старую версию от Xamarin (это подтверждается, потому что я извлек APK, чтобы увидеть, какая dll физически находится внутри, и нашел 2.0.5.0)

Теперь краткое изложение вопросов:

  1. Если я оставлю предупреждение и приму текущую ситуацию, у меня будет Microsoft.Csharp.dll 2.0.5.0. Я полагаю, что проект Android в порядке с этим, поскольку он изначально ссылается на эту версию, но как будет вести себя AutoMapper, поскольку он построен со ссылкой на 4.0.0.0 ? Если он использует какие-то новые функции, а в старой версии их нет, это нехорошо.
  2. Могу ли я каким-то образом заставить Xamarin использовать Microsoft.Csharp.dll 4.0.0.0, поскольку я не вижу эту ссылку напрямую (ссылка Mono использует ее)? Я не могу использовать перенаправление привязки из app.config, поскольку Xamarin для Android не поддерживает app.config. Даже если есть способ каким-то образом, это разумное решение, поскольку, возможно, Microsoft.Csharp 4.0.0.0 не имеет обратной совместимости с 2.0.5.0
  3. Если 1 или 2 не являются хорошими решениями, возможно ли каким-то образом (путь к базе кода или что-то еще) создать ситуацию, чтобы иметь обе версии и чтобы каждый компонент ссылался на свой оригинал?

Эта проблема с AutoMapper является всего лишь примером, но в основном это может произойти с любым другим пакетом. Я видел, что на самом деле это было с NewtonJson и решено в новой версии пакета NewtonJson, где удалена ссылка на Miscrosoft.Cshap.dll.

Я еще не видел проблемы с №1. Я считаю, что игнорирование этого - правильный путь, пока не будут исправлены github.com/Microsoft/msbuild/issues/1712 и github.com/Microsoft/msbuild/issues/608.

Jon Douglas 03.11.2018 18:58

@JonDouglas Спасибо за ответ. Не могли бы вы дать объяснение, чтобы я мог понять, что на самом деле происходит здесь, под капотом. Насколько я понимаю, единственное допустимое исправление для этого - обновление Xamarin для использования более новой версии библиотеки Microsoft.Csharp, поскольку, если она использует старую и механизм сборки выбирает ее для включения в пакет, тогда все остальные компоненты, которые ссылаются на более новую версию из этой библиотеки (например, AutoMapper) будет использовать эту старую, без функций, которые были введены после (основная версия изменена с 2 на 4). Поправьте меня, если я ошибаюсь, пожалуйста.

Miloš 03.11.2018 19:36

«2.0.5.0» означает, что сборка - это просто сборка, на которую имеется ссылка для Portable Class Library, blog.lextudio.com/…. Вы можете спокойно игнорировать такие предупреждения. Это слишком длинная история, чтобы рассказывать.

Lex Li 04.11.2018 00:06

@LexLi Спасибо за объяснение и ссылку. Добавлю еще одну ссылку, которая может быть очень полезна всем, кто интересуется этой темой. github.com/dotnet/standard/blob/master/docs/history/…

Miloš 04.11.2018 21:12

@ Милош Итак, ты избавился от предупреждения? У меня такое же состояние, как и у вас (в том числе с AutoMapper). Если да, не могли бы вы дать ответ?

Adam 26.11.2018 23:54

@Adam Предупреждение все еще существует, я просто проигнорировал его, как и предполагалось.

Miloš 28.11.2018 12:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
580
0

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