From 404bcf72c142357bea658ce845d5ff426a19a723 Mon Sep 17 00:00:00 2001 From: haolink <5476865+haolink@users.noreply.github.com> Date: Fri, 29 Aug 2025 19:17:07 +0200 Subject: [PATCH 1/3] Adds a Garbage Collector Handle fallback for Unity 2021.2.x --- .../Runtime/ClassInjectorBase.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs index 1fc35b5f..d15bca85 100644 --- a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs +++ b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs @@ -13,9 +13,33 @@ public static class ClassInjectorBase public static object GetMonoObjectFromIl2CppPointer(IntPtr pointer) { var gcHandle = GetGcHandlePtrFromIl2CppObject(pointer); + + if (gcHandle == IntPtr.Zero) // The Garbage collector handle might return a null pointer + { + gcHandle = FallbackGetGcHandlePtrFromIl2CppDelegateMTarget(pointer); + } + return GCHandle.FromIntPtr(gcHandle).Target; } + /// + /// Tries to get the Garbage collector pointer from the m_target object from the m_target of the delegate. + /// Fixes Harmony in Unity 2021.2.x . + /// + /// + /// + private unsafe static IntPtr FallbackGetGcHandlePtrFromIl2CppDelegateMTarget(IntPtr pointer) + { + if (IL2CPP.il2cpp_class_is_assignable_from(Il2CppClassPointerStore.NativeClassPtr, IL2CPP.il2cpp_object_get_class(pointer))) + { + var delegateObject = new Il2CppSystem.Delegate(pointer); + if (delegateObject.m_target != null && delegateObject.m_target.Pointer != IntPtr.Zero) { + return GetGcHandlePtrFromIl2CppObject(delegateObject.m_target.Pointer); + } + } + return IntPtr.Zero; + } + public static unsafe IntPtr GetGcHandlePtrFromIl2CppObject(IntPtr pointer) { return GetInjectedData(pointer)->managedGcHandle; From 7fc1cbc71788a590b632e6b17b725698607443eb Mon Sep 17 00:00:00 2001 From: haolink <5476865+haolink@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:48:45 +0200 Subject: [PATCH 2/3] Fix formatting. --- Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs index d15bca85..1b4c6f77 100644 --- a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs +++ b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs @@ -28,14 +28,13 @@ public static object GetMonoObjectFromIl2CppPointer(IntPtr pointer) /// /// /// - private unsafe static IntPtr FallbackGetGcHandlePtrFromIl2CppDelegateMTarget(IntPtr pointer) + private static IntPtr FallbackGetGcHandlePtrFromIl2CppDelegateMTarget(IntPtr pointer) { if (IL2CPP.il2cpp_class_is_assignable_from(Il2CppClassPointerStore.NativeClassPtr, IL2CPP.il2cpp_object_get_class(pointer))) { var delegateObject = new Il2CppSystem.Delegate(pointer); - if (delegateObject.m_target != null && delegateObject.m_target.Pointer != IntPtr.Zero) { + if (delegateObject.m_target != null && delegateObject.m_target.Pointer != IntPtr.Zero) return GetGcHandlePtrFromIl2CppObject(delegateObject.m_target.Pointer); - } } return IntPtr.Zero; } From fba494ad26da56a8f57244a3f6c0af8d1488b7d3 Mon Sep 17 00:00:00 2001 From: ManlyMarco <39247311+ManlyMarco@users.noreply.github.com> Date: Tue, 2 Sep 2025 08:52:27 +0200 Subject: [PATCH 3/3] Update Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs --- Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs index 1b4c6f77..96ea8d05 100644 --- a/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs +++ b/Il2CppInterop.Runtime/Runtime/ClassInjectorBase.cs @@ -26,8 +26,6 @@ public static object GetMonoObjectFromIl2CppPointer(IntPtr pointer) /// Tries to get the Garbage collector pointer from the m_target object from the m_target of the delegate. /// Fixes Harmony in Unity 2021.2.x . /// - /// - /// private static IntPtr FallbackGetGcHandlePtrFromIl2CppDelegateMTarget(IntPtr pointer) { if (IL2CPP.il2cpp_class_is_assignable_from(Il2CppClassPointerStore.NativeClassPtr, IL2CPP.il2cpp_object_get_class(pointer)))