Я потратил 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)
Теперь краткое изложение вопросов:
Эта проблема с AutoMapper является всего лишь примером, но в основном это может произойти с любым другим пакетом. Я видел, что на самом деле это было с NewtonJson и решено в новой версии пакета NewtonJson, где удалена ссылка на Miscrosoft.Cshap.dll.
@JonDouglas Спасибо за ответ. Не могли бы вы дать объяснение, чтобы я мог понять, что на самом деле происходит здесь, под капотом. Насколько я понимаю, единственное допустимое исправление для этого - обновление Xamarin для использования более новой версии библиотеки Microsoft.Csharp, поскольку, если она использует старую и механизм сборки выбирает ее для включения в пакет, тогда все остальные компоненты, которые ссылаются на более новую версию из этой библиотеки (например, AutoMapper) будет использовать эту старую, без функций, которые были введены после (основная версия изменена с 2 на 4). Поправьте меня, если я ошибаюсь, пожалуйста.
«2.0.5.0» означает, что сборка - это просто сборка, на которую имеется ссылка для Portable Class Library, blog.lextudio.com/…. Вы можете спокойно игнорировать такие предупреждения. Это слишком длинная история, чтобы рассказывать.
@LexLi Спасибо за объяснение и ссылку. Добавлю еще одну ссылку, которая может быть очень полезна всем, кто интересуется этой темой. github.com/dotnet/standard/blob/master/docs/history/…
@ Милош Итак, ты избавился от предупреждения? У меня такое же состояние, как и у вас (в том числе с AutoMapper). Если да, не могли бы вы дать ответ?
@Adam Предупреждение все еще существует, я просто проигнорировал его, как и предполагалось.





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