Rewrite 32-bit assemblies for 64-bit
This commit is contained in:
parent
9316fe3038
commit
ec5fbb0611
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
/****
|
||||
|
|
Loading…
Reference in New Issue