From bb40428df335878799942051db2b782227302bb7 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Wed, 27 Jul 2016 14:38:39 +0200 Subject: [PATCH] preserve Link action for assemblies - so that they are rewritten with the resolved references - fixes bug #42788 the issue in this bug looks like this: [mscorlib]System.MonoTODOAttribute is referenced from System.Core.dll. because ResolveFromAssemblyStep.ProcessLibrary sets the action to Copy, the System.Core.dll is only copied from original place and not saved with resolved references. the System.MonoTODOAttribute resolves to reference inside the Microsoft.CSharp.dll assembly (where it is kept, it is stripped from mscorlib) and thus the reflection fails at runtime, when tries to load System.Core.dll assembly --- .../Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs index 5c157821ede..18ced568b35 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/PreserveDynamicTypes.cs @@ -19,6 +19,14 @@ public override SubStepTargets Targets { bool preserve_dynamic; List saved = new List (); + void PreserveLibrary (AssemblyDefinition assembly) + { + var action = Annotations.GetAction (assembly); + ResolveFromAssemblyStep.ProcessLibrary (context, assembly); + if (action == AssemblyAction.Link) + Annotations.SetAction (assembly, action); + } + public override void ProcessAssembly (AssemblyDefinition assembly) { // Preserve dynamic dependencies only when Microsoft.CSharp is referenced. @@ -26,13 +34,13 @@ public override void ProcessAssembly (AssemblyDefinition assembly) case "Microsoft.CSharp": preserve_dynamic = true; foreach (var savedAssembly in saved) - ResolveFromAssemblyStep.ProcessLibrary (context, savedAssembly); - ResolveFromAssemblyStep.ProcessLibrary (context, assembly); + PreserveLibrary (savedAssembly); + PreserveLibrary (assembly); break; case "Mono.CSharp": case "System.Core": if (preserve_dynamic) - ResolveFromAssemblyStep.ProcessLibrary (context, assembly); + PreserveLibrary (assembly); else saved.Add (assembly); break;