Как решить версионность сборок в Xamarin android? - PullRequest
0 голосов
/ 03 ноября 2018

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

Я использую Xamarin для Android (не Xamarin Forms). Этот проект ссылается на мой проект стандарта .NET 2.0 (.NET Core), который содержит всю основную логику. Я установил Automapper через NuGet в своем основном проекте, и неожиданно у меня появилось предупреждение о сборке, описывающее конфликт. Конфликт состоит в том, что Xamarin для Android (Mono) использует Microsoft.Csharp.dll версии 2.0.5.0, а Auto mapper, на который ссылается основной проект, использует 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, так как я не вижу эту ссылку напрямую (используется моно ссылка)? Я не могу использовать перенаправление привязки из 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.

...