Łukasz Młynik
Łukasz Młynik

Reputation: 632

Xamarin and .NET Standard 2 Library issue

I've created a cross platform library which has 3 platform specific implementations:

I've packed the library with Nuget in a similar vein as the cross platform library project does it.

project layout

Now when I create a new Xamarin Forms project and select .NET Standard as the means to share the code, I reference my nuget and try running it in the android simulator, I get:

/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)

I've double checked and the SDK.NetStandard.dll exists in the nuget package.

I've tested it also with creating a simple console app with .NET Core 2 and the library works property there.

[EDIT]

I've renamed my package from SDK to Matchmore.SDK to lessen the confusion The error looks like this in runtime 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

Also after unpacking the nupkg you can see the DLL is in there. enter image description here

Upvotes: 14

Views: 5240

Answers (3)

DeshDeep Singh
DeshDeep Singh

Reputation: 1843

Visual Studio and .NET Core Tooling with .NET CLI below 2 doesn't fully support referencing assemblies. You need to package the library and use a project reference to the soltuion. The reason is that the required assmeblies with their versions are resolved during compilation and then write to the JSON file. While loading zour library assemblies, this might fail as they can#t find the right assembly or the dependencies.

Upvotes: 0

Shivani Katukota
Shivani Katukota

Reputation: 859

https://bugzilla.xamarin.com/show_bug.cgi?id=43713 should help you. This basically suggests that you use msbuild instead of xbuild.

If that is not possible use this work-around instead

  1. Instead of adding a .NET Standard library, add a PCL library.
  2. Get the project to run successfully
  3. Remove the Nuget packages from the PCL library
  4. Convert the PCL into a .NET Standard library
  5. Add the Nuget packages back in to the .NET Standard library
  6. Run the project again.
  7. The project should run successfully

Upvotes: 2

Tech Labradoodle
Tech Labradoodle

Reputation: 667

You are missing the SDK.NetStandard.dll file. Go to the Nuget and and install / update the NETStandard. Library, Solution -> Manage Nuget Packages for solution.enter image description here

Upvotes: 1

Related Questions