Skip to content

Instantly share code, notes, and snippets.

@gleblebedev
Created January 21, 2016 20:15
Show Gist options
  • Select an option

  • Save gleblebedev/e89e1d77d76644142d44 to your computer and use it in GitHub Desktop.

Select an option

Save gleblebedev/e89e1d77d76644142d44 to your computer and use it in GitHub Desktop.

Revisions

  1. gleblebedev created this gist Jan 21, 2016.
    34 changes: 34 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    using System.Linq;
    using Mono.Cecil;
    using Mono.Cecil.Cil;

    namespace FixActionBar
    {
    internal class Program
    {
    private static void Main(string[] args)
    {
    var fileName = @"_SOURCE_FOLDER_\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll";
    var typeName = "Xamarin.Forms.Platform.Android.Platform";


    var assembly = AssemblyDefinition.ReadAssembly(fileName);
    var types = assembly.Modules.SelectMany(_ => _.Types).ToDictionary(_ => _.Namespace + "." + _.Name);

    var platformType = types[typeName];

    var updateActionBarHomeAsUp = platformType.Methods.First(_ => _.Name == "UpdateActionBar");
    var actionBarGetter = platformType.Properties.First(_ => _.Name == "ActionBar").GetMethod;

    var ilProcessor = updateActionBarHomeAsUp.Body.GetILProcessor();

    var firstInstruction = ilProcessor.Body.Instructions[0];
    ilProcessor.InsertBefore(firstInstruction, Instruction.Create(OpCodes.Ldarg_0));
    ilProcessor.InsertBefore(firstInstruction, Instruction.Create(OpCodes.Call, actionBarGetter));
    ilProcessor.InsertBefore(firstInstruction, Instruction.Create(OpCodes.Brtrue_S, firstInstruction));
    ilProcessor.InsertBefore(firstInstruction, Instruction.Create(OpCodes.Ret));

    assembly.Write(@"_DEST_FOLDER_\Xamarin.Forms.Platform.Android.dll");
    }
    }
    }