Проблема с библиотекой Xamarin и.NET Standard 2

Я создал библиотеку кросс-платформы, которая имеет 3 специфичные для платформы реализации:

  • Android
  • IOS
  • .NET Standard 2.0

Я упаковал библиотеку с Nuget в том же духе, что и проект библиотеки кросс-платформенной библиотеки.

project layout

Теперь, когда я создаю новый проект Xamarin Forms и выбираю.NET Standard как средство для совместного использования кода, я ссылаюсь на свой nuget и пытаюсь запустить его в симуляторе Android, я получаю:

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(2,2): Error: Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'SDK.NetStandard, Version=1.0.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile?
File name: 'SDK.NetStandard.dll'
  at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference reference, Mono.Cecil.ReaderParameters parameters) [0x0009a] in /Users/builder/data/lanes/5945/342b2ce9/source/monodroid/external/xamarin-android/external/Java.Interop/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs:229 
  at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference reference) [0x00000] in /Users/builder/data/lanes/5945/342b2ce9/source/monodroid/external/xamarin-android/external/Java.Interop/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs:179 
  at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences (Java.Interop.Tools.Cecil.DirectoryAssemblyResolver resolver, System.Collections.Generic.ICollection'1[T] assemblies, Mono.Cecil.AssemblyDefinition assembly, System.Boolean topLevel) [0x0014a] in <fdfe8f54615a4e2ab24c72dc90da5c64>:0 
  at Xamarin.Android.Tasks.ResolveAssemblies.Execute (Java.Interop.Tools.Cecil.DirectoryAssemblyResolver resolver) [0x00237] in <fdfe8f54615a4e2ab24c72dc90da5c64>:0  (blank.Android)

Я дважды проверял, и SDK.NetStandard.dll существует в пакете nuget.

Я тестировал его также с созданием простого консольного приложения с.NET Core 2 и там, где работает библиотека.

[РЕДАКТИРОВАТЬ]

Я переименовал свой пакет из SDK в Matchmore.SDK, чтобы уменьшить путаницу. Ошибка выглядит так во время работы iOS.

System.IO.FileNotFoundException: Could not load file or assembly 'Matchmore.SDK.NetStandard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
  at blankstandard.App..ctor () [0x0001b] in /Users/lmlynik/Projects/blankstandard/blankstandard/App.xaml.cs:15
  at blankstandard.iOS.AppDelegate.FinishedLaunching (UIKit.UIApplication app, Foundation.NSDictionary options) [0x00007] in /Users/lmlynik/Projects/blankstandard/blankstandard.iOS/AppDelegate.cs:26
  at at (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.10.1.178/src/Xamarin.iOS/UIKit/UIApplication.cs:79
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0002c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.10.1.178/src/Xamarin.iOS/UIKit/UIApplication.cs:63
  at blankstandard.iOS.Application.Main (System.String[] args) [0x00001] in /Users/lmlynik/Projects/blankstandard/blankstandard.iOS/Main.cs:17

Также после распаковки nupkg вы можете видеть, что DLL находится там. enter image description here

Ответы

Ответ 1

Вам не доставлен файл SDK.NetStandard.dll. Перейдите в Nuget и установите/обновите NETStandard. Библиотека, решение → Управление пакетами Nuget для решения. enter image description here

Ответ 2

https://bugzilla.xamarin.com/show_bug.cgi?id=43713 должен помочь вам. Это в основном предполагает, что вы используете msbuild вместо xbuild.

Если это невозможно, используйте эту

  1. Вместо добавления библиотеки.NET Standard добавьте библиотеку PCL.
  2. Получить проект для успешного запуска
  3. Удалите пакеты Nuget из библиотеки PCL
  4. Преобразование PCL в библиотеку.NET Standard
  5. Добавьте пакеты Nuget обратно в библиотеку.NET Standard
  6. Запустите проект еще раз.
  7. Проект должен успешно работать

Ответ 3

Visual Studio и.NET Core Tooling с.NET CLI ниже 2 не полностью поддерживают ссылки на сборки. Вам необходимо упаковать библиотеку и использовать ссылку на проект для soltuion. Причина в том, что требуемые assmeblies с их версиями решаются во время компиляции, а затем записываются в файл JSON. При загрузке сборников библиотеки zour это может завершиться неудачно, поскольку они не могут найти правильную сборку или зависимости.