rewrite AccessTools methods which changed in Harmony 2.0 (#711)
This commit is contained in:
parent
1ff0968590
commit
10531e537f
|
@ -42,8 +42,9 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters
|
||||||
/// <param name="fromType">The type whose methods to remap.</param>
|
/// <param name="fromType">The type whose methods to remap.</param>
|
||||||
/// <param name="toType">The type with methods to map to.</param>
|
/// <param name="toType">The type with methods to map to.</param>
|
||||||
/// <param name="onlyIfPlatformChanged">Whether to only rewrite references if loading the assembly on a different platform than it was compiled on.</param>
|
/// <param name="onlyIfPlatformChanged">Whether to only rewrite references if loading the assembly on a different platform than it was compiled on.</param>
|
||||||
public MethodParentRewriter(Type fromType, Type toType, bool onlyIfPlatformChanged = false)
|
/// <param name="nounPhrase">A brief noun phrase indicating what the instruction finder matches (or <c>null</c> to generate one).</param>
|
||||||
: this(fromType.FullName, toType, onlyIfPlatformChanged) { }
|
public MethodParentRewriter(Type fromType, Type toType, bool onlyIfPlatformChanged = false, string nounPhrase = null)
|
||||||
|
: this(fromType.FullName, toType, onlyIfPlatformChanged, nounPhrase) { }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>Perform the predefined logic for an instruction if applicable.</summary>
|
/// <summary>Perform the predefined logic for an instruction if applicable.</summary>
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Reflection;
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
|
namespace StardewModdingAPI.Framework.RewriteFacades
|
||||||
|
{
|
||||||
|
/// <summary>Maps Harmony 1.x <see cref="AccessTools"/> methods to Harmony 2.x to avoid breaking older mods.</summary>
|
||||||
|
/// <remarks>This is public to support SMAPI rewriting and should not be referenced directly by mods.</remarks>
|
||||||
|
[SuppressMessage("ReSharper", "CS1591", Justification = "Documentation not needed for facade classes.")]
|
||||||
|
public class AccessToolsMethods
|
||||||
|
{
|
||||||
|
/*********
|
||||||
|
** Public methods
|
||||||
|
*********/
|
||||||
|
public static ConstructorInfo DeclaredConstructor(Type type, Type[] parameters = null)
|
||||||
|
{
|
||||||
|
return AccessTools.DeclaredConstructor(type, parameters, searchForStatic: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConstructorInfo Constructor(Type type, Type[] parameters = null)
|
||||||
|
{
|
||||||
|
return AccessTools.Constructor(type, parameters, searchForStatic: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<ConstructorInfo> GetDeclaredConstructors(Type type)
|
||||||
|
{
|
||||||
|
return AccessTools.GetDeclaredConstructors(type, searchForStatic: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Reflection.Emit;
|
using System.Reflection.Emit;
|
||||||
|
@ -7,8 +8,9 @@ using HarmonyLib;
|
||||||
|
|
||||||
namespace StardewModdingAPI.Framework.RewriteFacades
|
namespace StardewModdingAPI.Framework.RewriteFacades
|
||||||
{
|
{
|
||||||
/// <summary>Maps Harmony 1.x methods to Harmony 2.x to avoid breaking older mods.</summary>
|
/// <summary>Maps Harmony 1.x <code>HarmonyInstance</code> methods to Harmony 2.x's <see cref="Harmony"/> to avoid breaking older mods.</summary>
|
||||||
/// <remarks>This is public to support SMAPI rewriting and should not be referenced directly by mods.</remarks>
|
/// <remarks>This is public to support SMAPI rewriting and should not be referenced directly by mods.</remarks>
|
||||||
|
[SuppressMessage("ReSharper", "CS1591", Justification = "Documentation not needed for facade classes.")]
|
||||||
public class HarmonyInstanceMethods : Harmony
|
public class HarmonyInstanceMethods : Harmony
|
||||||
{
|
{
|
||||||
/*********
|
/*********
|
||||||
|
@ -19,18 +21,11 @@ namespace StardewModdingAPI.Framework.RewriteFacades
|
||||||
public HarmonyInstanceMethods(string id)
|
public HarmonyInstanceMethods(string id)
|
||||||
: base(id) { }
|
: base(id) { }
|
||||||
|
|
||||||
/// <summary>Creates a new Harmony instance.</summary>
|
|
||||||
/// <param name="id">A unique identifier for the instance.</param>
|
|
||||||
public static Harmony Create(string id)
|
public static Harmony Create(string id)
|
||||||
{
|
{
|
||||||
return new Harmony(id);
|
return new Harmony(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Apply one or more patches to a method.</summary>
|
|
||||||
/// <param name="original">The original method.</param>
|
|
||||||
/// <param name="prefix">The prefix to apply.</param>
|
|
||||||
/// <param name="postfix">The postfix to apply.</param>
|
|
||||||
/// <param name="transpiler">The transpiler to apply.</param>
|
|
||||||
public DynamicMethod Patch(MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null, HarmonyMethod transpiler = null)
|
public DynamicMethod Patch(MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null, HarmonyMethod transpiler = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -38,7 +38,8 @@ namespace StardewModdingAPI.Metadata
|
||||||
|
|
||||||
// rewrite for SMAPI 3.6 (Harmony 1.x => 2.0 update)
|
// rewrite for SMAPI 3.6 (Harmony 1.x => 2.0 update)
|
||||||
yield return new Harmony1AssemblyRewriter();
|
yield return new Harmony1AssemblyRewriter();
|
||||||
yield return new MethodParentRewriter("HarmonyLib.Harmony", typeof(HarmonyInstanceMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
|
yield return new MethodParentRewriter(typeof(HarmonyLib.Harmony), typeof(HarmonyInstanceMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
|
||||||
|
yield return new MethodParentRewriter(typeof(HarmonyLib.AccessTools), typeof(AccessToolsMethods), onlyIfPlatformChanged: false, nounPhrase: Harmony1AssemblyRewriter.DefaultNounPhrase);
|
||||||
|
|
||||||
/****
|
/****
|
||||||
** detect mod issues
|
** detect mod issues
|
||||||
|
|
Loading…
Reference in New Issue