Skip to content

Instantly share code, notes, and snippets.

@gleblebedev
Created January 21, 2016 20:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gleblebedev/e89e1d77d76644142d44 to your computer and use it in GitHub Desktop.
Save gleblebedev/e89e1d77d76644142d44 to your computer and use it in GitHub Desktop.
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");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment