@@ -819,6 +819,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
819819 return CreateTrampoline ( monoMethod ) ;
820820 }
821821
822+ private static Type [ ] GetNativeParameterTypes ( MethodInfo monoMethod )
823+ {
824+ var nativeParameterTypes = new List < Type > ( ) ;
825+ if ( ! monoMethod . IsStatic )
826+ nativeParameterTypes . Add ( typeof ( IntPtr ) ) ;
827+ nativeParameterTypes . AddRange ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) ) ;
828+ nativeParameterTypes . Add ( typeof ( Il2CppMethodInfo * ) ) ;
829+ return nativeParameterTypes . ToArray ( ) ;
830+ }
831+
822832 private static Delegate CreateInvoker ( MethodInfo monoMethod )
823833 {
824834 DynamicMethod method ;
@@ -842,11 +852,11 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
842852 var body = method . GetILGenerator ( ) ;
843853
844854 if ( ! monoMethod . IsStatic )
845- body . Emit ( OpCodes . Ldarg_2 ) ;
855+ body . Emit ( OpCodes . Ldarg_2 ) ; // obj
846856 for ( var i = 0 ; i < monoMethod . GetParameters ( ) . Length ; i ++ )
847857 {
848858 var parameterInfo = monoMethod . GetParameters ( ) [ i ] ;
849- body . Emit ( OpCodes . Ldarg_3 ) ;
859+ body . Emit ( OpCodes . Ldarg_3 ) ; // args
850860 body . Emit ( OpCodes . Ldc_I4 , i * IntPtr . Size ) ;
851861 body . Emit ( OpCodes . Add_Ovf_Un ) ;
852862 var nativeType = parameterInfo . ParameterType . NativeType ( ) ;
@@ -855,10 +865,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
855865 body . Emit ( OpCodes . Ldobj , nativeType ) ;
856866 }
857867
858- body . Emit ( OpCodes . Ldarg_0 ) ;
859- body . EmitCalli ( OpCodes . Calli , CallingConvention . Cdecl , monoMethod . ReturnType . NativeType ( ) ,
860- new [ ] { typeof ( IntPtr ) } . Concat ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) )
861- . ToArray ( ) ) ;
868+ body . Emit ( OpCodes . Ldarg_1 ) ; // methodMetadata
869+ body . Emit ( OpCodes . Ldarg_0 ) ; // methodPointer
870+ body . EmitCalli ( OpCodes . Calli , CallingConvention . Cdecl , monoMethod . ReturnType . NativeType ( ) , GetNativeParameterTypes ( monoMethod ) ) ;
862871
863872 if ( UnityVersionHandler . IsMetadataV29OrHigher )
864873 {
@@ -924,12 +933,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
924933
925934 private static Delegate CreateTrampoline ( MethodInfo monoMethod )
926935 {
927- var nativeParameterTypes = new List < Type > ( ) ;
928- if ( ! monoMethod . IsStatic )
929- nativeParameterTypes . Add ( typeof ( IntPtr ) ) ;
930- nativeParameterTypes . AddRange ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) ) ;
931- nativeParameterTypes . Add ( typeof ( Il2CppMethodInfo * ) ) ;
932-
933936 var managedParameters = new List < Type > ( ) ;
934937 if ( ! monoMethod . IsStatic )
935938 managedParameters . Add ( monoMethod . DeclaringType ) ;
@@ -938,7 +941,7 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
938941 var method = new DynamicMethod (
939942 "Trampoline_" + ExtractSignature ( monoMethod ) + monoMethod . DeclaringType + monoMethod . Name ,
940943 MethodAttributes . Static | MethodAttributes . Public , CallingConventions . Standard ,
941- monoMethod . ReturnType . NativeType ( ) , nativeParameterTypes . ToArray ( ) ,
944+ monoMethod . ReturnType . NativeType ( ) , GetNativeParameterTypes ( monoMethod ) ,
942945 monoMethod . DeclaringType , true ) ;
943946
944947 var signature = new DelegateSupport . MethodSignature ( monoMethod , ! monoMethod . IsStatic ) ;
@@ -958,7 +961,9 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
958961
959962 var indirectVariables = new LocalBuilder [ managedParameters . Count ] ;
960963
961- for ( var i = 1 ; i < managedParameters . Count ; i ++ )
964+ var argOffset = method . IsStatic ? 0 : 1 ;
965+
966+ for ( var i = argOffset ; i < managedParameters . Count ; i ++ )
962967 {
963968 var parameter = managedParameters [ i ] ;
964969 if ( parameter . IsSubclassOf ( typeof ( ValueType ) ) )
@@ -1028,7 +1033,7 @@ void HandleTypeConversion(Type type)
10281033 body . Emit ( OpCodes . Stloc , managedReturnVariable ) ;
10291034 }
10301035
1031- for ( var i = 1 ; i < managedParameters . Count ; i ++ )
1036+ for ( var i = argOffset ; i < managedParameters . Count ; i ++ )
10321037 {
10331038 var variable = indirectVariables [ i ] ;
10341039 if ( variable == null )
0 commit comments