Skip to content

Bootstrapping

Andreas Pardeike edited this page Apr 17, 2019 · 11 revisions

To instantiate Harmony, you simply call

var harmony = HarmonyInstance.Create("com.company.project.product");

The id should be in reverse domain notation and must be unique. In order to understand and react on existing patches of others, all patches in Harmony are bound to that id.

This allows other authors to execute their patches before or after a specific patch by using the HarmonyBefore and HarmonyAfter annotations.

Once you have a Harmony instance, you can delegate the search for patch methods to Harmony by calling

harmony.PatchAll(Assembly.GetExecutingAssembly());

which will search the give assembly for all classes that are annotated with Harmony annotations. All patches are registered automatically and you're done.

Manual patching

For more control, you can patch like this:

var harmony = HarmonyInstance.Create("com.company.project.product");
var original = typeof(TheClass).GetMethod("TheMethod");
var prefix = typeof(MyPatchClass1).GetMethod("SomeMethod");
var postfix = typeof(MyPatchClass2).GetMethod("SomeMethod");
harmony.Patch(original, new HarmonyMethod(prefix), new HarmonyMethod(postfix));

Checking for existing patches

To get a list of already patched methods, you call

var harmony = HarmonyInstance.Create("com.company.project.product");var methods = harmony.GetPatchedMethods();
foreach (var method in methods)
{
	//...
}

If you want to know if a specific method is already patched, you can call HarmonyInstance.GetPatchInfo(MethodInfo):

var harmony = HarmonyInstance.Create("com.company.project.product");var original = typeof(TheClass).GetMethod("TheMethod");
var info = harmony.GetPatchInfo(original);
if (info == null) return; // not patched
foreach (var patch in info.Prefixes)
{
	Console.WriteLine("index: " + patch.index);
	Console.WriteLine("index: " + patch.owner);
	Console.WriteLine("index: " + patch.patch);
	Console.WriteLine("index: " + patch.priority);
	Console.WriteLine("index: " + patch.before);
	Console.WriteLine("index: " + patch.after);
}
foreach (var patch in info.Postfixes)
{
	//...
}
foreach (var patch in info.Transpilers)
{
	//...
}
// all owners shortcut
Console.WriteLine("all owners: " + info.Owners);

Next: Patching