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)))