Skip to content

Commit 51af7b5

Browse files
committed
Allow static method injection
1 parent 1847230 commit 51af7b5

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

Il2CppInterop.Runtime/Injection/ClassInjector.cs

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,6 @@ private static bool IsFieldEligible(FieldInfo field)
526526
private static bool IsMethodEligible(MethodInfo method)
527527
{
528528
if (method.Name == "Finalize") return false;
529-
if (method.IsStatic) return false;
530529
if (method.CustomAttributes.Any(it => typeof(HideFromIl2CppAttribute).IsAssignableFrom(it.AttributeType)))
531530
return false;
532531

@@ -559,10 +558,12 @@ private static bool IsMethodEligible(MethodInfo method)
559558
foreach (var parameter in method.GetParameters())
560559
{
561560
var parameterType = parameter.ParameterType;
562-
if (!IsTypeSupported(parameterType))
561+
if (!IsTypeSupported(parameterType) ||
562+
method.IsStatic && parameterType.IsGenericType && parameterType.ContainsGenericParameters)
563563
{
564564
Logger.Instance.LogWarning(
565-
"Method {Method} on type {DeclaringType} has unsupported parameter {Parameter} of type {ParameterType}", method.ToString(), method.DeclaringType, parameter, parameterType);
565+
"Method {Method} on type {DeclaringType} has unsupported parameter {Parameter} of type {ParameterType}", method.ToString(),
566+
method.DeclaringType, parameter, parameterType);
566567
return false;
567568
}
568569
}
@@ -702,6 +703,11 @@ private static bool IsMethodEligible(MethodInfo method)
702703
converted.Flags = Il2CppMethodFlags.METHOD_ATTRIBUTE_PUBLIC |
703704
Il2CppMethodFlags.METHOD_ATTRIBUTE_HIDE_BY_SIG;
704705

706+
if (monoMethod.IsStatic)
707+
{
708+
converted.Flags |= Il2CppMethodFlags.METHOD_ATTRIBUTE_STATIC;
709+
}
710+
705711
if (monoMethod.IsAbstract)
706712
{
707713
converted.Flags |= Il2CppMethodFlags.METHOD_ATTRIBUTE_ABSTRACT;
@@ -810,7 +816,8 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
810816

811817
var body = method.GetILGenerator();
812818

813-
body.Emit(OpCodes.Ldarg_2);
819+
if (!monoMethod.IsStatic)
820+
body.Emit(OpCodes.Ldarg_2);
814821
for (var i = 0; i < monoMethod.GetParameters().Length; i++)
815822
{
816823
var parameterInfo = monoMethod.GetParameters()[i];
@@ -892,33 +899,41 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
892899

893900
private static Delegate CreateTrampoline(MethodInfo monoMethod)
894901
{
895-
var nativeParameterTypes = new[] { typeof(IntPtr) }.Concat(monoMethod.GetParameters()
896-
.Select(it => it.ParameterType.NativeType()).Concat(new[] { typeof(Il2CppMethodInfo*) })).ToArray();
902+
var nativeParameterTypes = new List<Type>();
903+
if (!monoMethod.IsStatic)
904+
nativeParameterTypes.Add(typeof(IntPtr));
905+
nativeParameterTypes.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()));
906+
nativeParameterTypes.Add(typeof(Il2CppMethodInfo*));
897907

898-
var managedParameters = new[] { monoMethod.DeclaringType }
899-
.Concat(monoMethod.GetParameters().Select(it => it.ParameterType)).ToArray();
908+
var managedParameters = new List<Type>();
909+
if (!monoMethod.IsStatic)
910+
managedParameters.Add(monoMethod.DeclaringType);
911+
managedParameters.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType));
900912

901913
var method = new DynamicMethod(
902914
"Trampoline_" + ExtractSignature(monoMethod) + monoMethod.DeclaringType + monoMethod.Name,
903915
MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard,
904-
monoMethod.ReturnType.NativeType(), nativeParameterTypes,
916+
monoMethod.ReturnType.NativeType(), nativeParameterTypes.ToArray(),
905917
monoMethod.DeclaringType, true);
906918

907-
var signature = new DelegateSupport.MethodSignature(monoMethod, true);
919+
var signature = new DelegateSupport.MethodSignature(monoMethod, !monoMethod.IsStatic);
908920
var delegateType = DelegateSupport.GetOrCreateDelegateType(signature, monoMethod);
909921

910922
var body = method.GetILGenerator();
911923

912924
body.BeginExceptionBlock();
913925

914-
body.Emit(OpCodes.Ldarg_0);
915-
body.Emit(OpCodes.Call,
916-
typeof(ClassInjectorBase).GetMethod(nameof(ClassInjectorBase.GetMonoObjectFromIl2CppPointer))!);
917-
body.Emit(OpCodes.Castclass, monoMethod.DeclaringType);
926+
if (!monoMethod.IsStatic)
927+
{
928+
body.Emit(OpCodes.Ldarg_0);
929+
body.Emit(OpCodes.Call,
930+
typeof(ClassInjectorBase).GetMethod(nameof(ClassInjectorBase.GetMonoObjectFromIl2CppPointer))!);
931+
body.Emit(OpCodes.Castclass, monoMethod.DeclaringType);
932+
}
918933

919-
var indirectVariables = new LocalBuilder[managedParameters.Length];
934+
var indirectVariables = new LocalBuilder[managedParameters.Count];
920935

921-
for (var i = 1; i < managedParameters.Length; i++)
936+
for (var i = 1; i < managedParameters.Count; i++)
922937
{
923938
var parameter = managedParameters[i];
924939
if (parameter.IsSubclassOf(typeof(ValueType)))
@@ -988,7 +1003,7 @@ void HandleTypeConversion(Type type)
9881003
body.Emit(OpCodes.Stloc, managedReturnVariable);
9891004
}
9901005

991-
for (var i = 1; i < managedParameters.Length; i++)
1006+
for (var i = 1; i < managedParameters.Count; i++)
9921007
{
9931008
var variable = indirectVariables[i];
9941009
if (variable == null)

0 commit comments

Comments
 (0)