Bläddra i källkod

Fix patching static methods

ghorsington 4 år sedan
förälder
incheckning
d1ed073c5d
1 ändrade filer med 9 tillägg och 8 borttagningar
  1. 9 8
      BepInEx.IL2CPP/Hook/IL2CPPDetourMethodPatcher.cs

+ 9 - 8
BepInEx.IL2CPP/Hook/IL2CPPDetourMethodPatcher.cs

@@ -160,15 +160,16 @@ namespace BepInEx.IL2CPP.Hook
 			// managedParams are the unhollower types used on the managed side
 			// unmanagedParams are IntPtr references that are used by IL2CPP compiled assembly
 
+			var paramStartIndex = Original.IsStatic ? 0 : 1;
+			
 			var managedParams = Original.GetParameters().Select(x => x.ParameterType).ToArray();
-			var unmanagedParams = new Type[managedParams.Length + 2]; // +1 for thisptr at the start, +1 for methodInfo at the end
-			// TODO: Check if this breaks for static IL2CPP methods
-
-
-			unmanagedParams[0] = typeof(IntPtr);
+			var unmanagedParams = new Type[managedParams.Length + 1]; // thisptr is assumed to be at the start, +1 for methodInfo at the end
+			
+			if (Original.IsStatic)
+				unmanagedParams[0] = typeof(IntPtr);
 			unmanagedParams[unmanagedParams.Length - 1] = typeof(Il2CppMethodInfo*);
 			Array.Copy(managedParams.Select(ConvertManagedTypeToIL2CPPType).ToArray(), 0,
-				unmanagedParams, 1, managedParams.Length);
+				unmanagedParams, paramStartIndex, managedParams.Length);
 
 			var managedReturnType = AccessTools.GetReturnedType(Original);
 			var unmanagedReturnType = ConvertManagedTypeToIL2CPPType(managedReturnType);
@@ -198,7 +199,7 @@ namespace BepInEx.IL2CPP.Hook
 
 			for (int i = 0; i < managedParams.Length; ++i)
 			{
-				il.Emit(OpCodes.Ldarg_S, i + 1);
+				il.Emit(OpCodes.Ldarg_S, i + paramStartIndex);
 				EmitConvertArgumentToManaged(il, managedParams[i], out indirectVariables[i]);
 			}
 
@@ -225,7 +226,7 @@ namespace BepInEx.IL2CPP.Hook
 				if (indirectVariables[i] == null)
 					continue;
 
-				il.Emit(OpCodes.Ldarg_S, i + 1);
+				il.Emit(OpCodes.Ldarg_S, i + paramStartIndex);
 				il.Emit(OpCodes.Ldloc, indirectVariables[i]);
 
 				EmitConvertManagedTypeToIL2CPP(il, managedParams[i].GetElementType());