From 8858c076ade88ed92d828833e9f4408b3e23dcdc Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Thu, 27 Jul 2017 17:02:30 +0100 Subject: [PATCH] [Xamarin.Android.Build.Tasks] Crash - NetStandard library - could not load assembly during startup registration. Context https://bugzilla.xamarin.com/show_bug.cgi?id=57342 The investigation in the bug suggests that we are pickin up a reference assembly rather than a the actual implementation. This is to do with the way netstandard nuget packages work, they include both 'ref' and 'lib' folders. In this case 'ref' was being included in the package rather than 'lib'. This commit alters the `_ResolveAssemblies` to use `@(ReferenceCopyLocalPaths)` This ItemGroup is populated with the correct items. --- Makefile | 2 +- src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs | 7 +++++++ .../Utilities/MonoAndroidHelper.cs | 9 +++++++++ .../Xamarin.Android.Common.targets | 6 +++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 5f4471a390e..d1e8d3798eb 100644 --- a/Makefile +++ b/Makefile @@ -149,7 +149,7 @@ TEST_APK_PROJECTS = \ # Syntax: $(call BUILD_TEST_APK,path/to/project.csproj) define BUILD_TEST_APK # Must use xabuild to ensure correct assemblies are resolved - MSBUILD="$(MSBUILD)" tools/scripts/xabuild /t:SignAndroidPackage $(1) + MSBUILD="$(MSBUILD)" tools/scripts/xabuild $(MSBUILD_FLAGS) /t:SignAndroidPackage $(1) endef # BUILD_TEST_APK run-apk-tests: diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs index c98b6f23379..cc37c749077 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/BuildApk.cs @@ -273,6 +273,10 @@ private void AddAssemblies (ZipArchiveEx apk) int count = 0; foreach (ITaskItem assembly in ResolvedUserAssemblies) { + + if (MonoAndroidHelper.IsReferenceAssembly (assembly.ItemSpec)) { + Log.LogWarning ($"{assembly.ItemSpec} is a reference assembly!"); + } // Add assembly apk.Archive.AddFile (assembly.ItemSpec, GetTargetDirectory (assembly.ItemSpec) + "/" + Path.GetFileName (assembly.ItemSpec), compressionMethod: CompressionMethod.Store); @@ -305,6 +309,9 @@ private void AddAssemblies (ZipArchiveEx apk) count = 0; // Add framework assemblies foreach (ITaskItem assembly in ResolvedFrameworkAssemblies) { + if (MonoAndroidHelper.IsReferenceAssembly (assembly.ItemSpec)) { + Log.LogWarning ($"{assembly.ItemSpec} is a reference assembly!"); + } apk.Archive.AddFile (assembly.ItemSpec, "assemblies/" + Path.GetFileName (assembly.ItemSpec), compressionMethod: CompressionMethod.Store); var config = Path.ChangeExtension (assembly.ItemSpec, "dll.config"); AddAssemblyConfigEntry (apk, config); diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs index 83921a11285..3793b77e161 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs @@ -8,6 +8,7 @@ using Mono.Security.Cryptography; using Xamarin.Android.Build.Utilities; using Xamarin.Tools.Zip; +using Mono.Cecil; #if MSBUILD using Microsoft.Build.Framework; @@ -286,6 +287,14 @@ public static bool IsFrameworkAssembly (string assembly, bool checkSdkPath) return TargetFrameworkDirectories == null || !checkSdkPath ? false : ExistsInFrameworkPath (assembly); } + public static bool IsReferenceAssembly (string assembly) + { + var a = AssemblyDefinition.ReadAssembly (assembly, new ReaderParameters() { InMemory = true, ReadSymbols = false, }); + if (!a.HasCustomAttributes) + return false; + return a.CustomAttributes.Any (t => t.AttributeType.FullName == "System.Runtime.CompilerServices.ReferenceAssemblyAttribute"); + } + public static bool ExistsInFrameworkPath (string assembly) { return TargetFrameworkDirectories diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index c3127c71ea7..ce3a3894107 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -1417,7 +1417,11 @@ because xbuild doesn't support framework reference assemblies. - + + +