Rewrite 32-bit assemblies for 64-bit

This commit is contained in:
Chase Warrington 2021-08-29 15:48:28 -04:00 committed by Jesse Plamondon-Willard
parent 9316fe3038
commit ec5fbb0611
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
6 changed files with 67 additions and 1 deletions

View File

@ -336,6 +336,13 @@ namespace StardewModdingAPI.Framework.ModLoading
IInstructionHandler[] handlers = new InstructionMetadata().GetHandlers(this.ParanoidMode, platformChanged, this.RewriteMods).ToArray();
RecursiveRewriter rewriter = new RecursiveRewriter(
module: module,
rewriteModule: (module) =>
{
bool rewritten = false;
foreach (IInstructionHandler handler in handlers)
rewritten |= handler.Handle(module);
return rewritten;
},
rewriteType: (type, replaceWith) =>
{
bool rewritten = false;

View File

@ -24,6 +24,12 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework
/*********
** Public methods
*********/
/// <inheritdoc />
public virtual bool Handle(ModuleDefinition module)
{
return false;
}
/// <inheritdoc />
public virtual bool Handle(ModuleDefinition module, TypeReference type, Action<TypeReference> replaceWith)
{

View File

@ -13,6 +13,11 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework
/*********
** Delegates
*********/
/// <summary>Rewrite a module definition in the assembly code.</summary>
/// <param name="module">The current module definition.</param>
/// <returns>Returns whether the module was changed.</returns>
public delegate bool RewriteModuleDelegate(ModuleDefinition module);
/// <summary>Rewrite a type reference in the assembly code.</summary>
/// <param name="type">The current type reference.</param>
/// <param name="replaceWith">Replaces the type reference with the given type.</param>
@ -32,6 +37,9 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework
/// <summary>The module to rewrite.</summary>
public ModuleDefinition Module { get; }
/// <summary>Handle or rewrite a type reference if needed.</summary>
public RewriteModuleDelegate RewriteModuleImpl { get; }
/// <summary>Handle or rewrite a type reference if needed.</summary>
public RewriteTypeDelegate RewriteTypeImpl { get; }
@ -46,9 +54,10 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework
/// <param name="module">The module to rewrite.</param>
/// <param name="rewriteType">Handle or rewrite a type reference if needed.</param>
/// <param name="rewriteInstruction">Handle or rewrite a CIL instruction if needed.</param>
public RecursiveRewriter(ModuleDefinition module, RewriteTypeDelegate rewriteType, RewriteInstructionDelegate rewriteInstruction)
public RecursiveRewriter(ModuleDefinition module, RewriteModuleDelegate rewriteModule, RewriteTypeDelegate rewriteType, RewriteInstructionDelegate rewriteInstruction)
{
this.Module = module;
this.RewriteModuleImpl = rewriteModule;
this.RewriteTypeImpl = rewriteType;
this.RewriteInstructionImpl = rewriteInstruction;
}
@ -63,6 +72,8 @@ namespace StardewModdingAPI.Framework.ModLoading.Framework
try
{
changed |= this.RewriteModuleImpl( this.Module );
foreach (var type in types)
changed |= this.RewriteTypeDefinition(type);
}

View File

@ -24,6 +24,11 @@ namespace StardewModdingAPI.Framework.ModLoading
/*********
** Methods
*********/
/// <summary>Rewrite a module definition if needed.</summary>
/// <param name="module">The assembly module.</param>
/// <returns>Returns whether the module was changed.</returns>
bool Handle(ModuleDefinition module);
/// <summary>Rewrite a type reference if needed.</summary>
/// <param name="module">The assembly module containing the instruction.</param>
/// <param name="type">The type definition to handle.</param>

View File

@ -0,0 +1,34 @@
using System;
using HarmonyLib;
using Mono.Cecil;
using Mono.Cecil.Cil;
using StardewModdingAPI.Framework.ModLoading.Framework;
using StardewModdingAPI.Framework.ModLoading.RewriteFacades;
namespace StardewModdingAPI.Framework.ModLoading.Rewriters
{
/// <summary>Rewrites Harmony 1.x assembly references to work with Harmony 2.x.</summary>
internal class ArchitectureAssemblyRewriter : BaseInstructionHandler
{
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
public ArchitectureAssemblyRewriter()
: base(defaultPhrase: "32-bit architecture") { }
/// <inheritdoc />
public override bool Handle( ModuleDefinition module )
{
if ( module.Attributes.HasFlag( ModuleAttributes.Required32Bit ) )
{
module.Attributes = module.Attributes & ~ModuleAttributes.Required32Bit;
this.MarkRewritten();
return true;
}
return false;
}
}
}

View File

@ -50,6 +50,9 @@ namespace StardewModdingAPI.Metadata
// rewrite for SMAPI 3.12 (Harmony 1.x => 2.0 update)
yield return new Harmony1AssemblyRewriter();
// rewrite for 64-bit mode
yield return new ArchitectureAssemblyRewriter();
}
/****