@@ -818,6 +818,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
818818 return CreateTrampoline ( monoMethod ) ;
819819 }
820820
821+ private static Type [ ] GetNativeParameterTypes ( MethodInfo monoMethod )
822+ {
823+ var nativeParameterTypes = new List < Type > ( ) ;
824+ if ( ! monoMethod . IsStatic )
825+ nativeParameterTypes . Add ( typeof ( IntPtr ) ) ;
826+ nativeParameterTypes . AddRange ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) ) ;
827+ nativeParameterTypes . Add ( typeof ( Il2CppMethodInfo * ) ) ;
828+ return nativeParameterTypes . ToArray ( ) ;
829+ }
830+
821831 private static Delegate CreateInvoker ( MethodInfo monoMethod )
822832 {
823833 DynamicMethod method ;
@@ -841,11 +851,11 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
841851 var body = method . GetILGenerator ( ) ;
842852
843853 if ( ! monoMethod . IsStatic )
844- body . Emit ( OpCodes . Ldarg_2 ) ;
854+ body . Emit ( OpCodes . Ldarg_2 ) ; // obj
845855 for ( var i = 0 ; i < monoMethod . GetParameters ( ) . Length ; i ++ )
846856 {
847857 var parameterInfo = monoMethod . GetParameters ( ) [ i ] ;
848- body . Emit ( OpCodes . Ldarg_3 ) ;
858+ body . Emit ( OpCodes . Ldarg_3 ) ; // args
849859 body . Emit ( OpCodes . Ldc_I4 , i * IntPtr . Size ) ;
850860 body . Emit ( OpCodes . Add_Ovf_Un ) ;
851861 var nativeType = parameterInfo . ParameterType . NativeType ( ) ;
@@ -854,10 +864,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
854864 body . Emit ( OpCodes . Ldobj , nativeType ) ;
855865 }
856866
857- body . Emit ( OpCodes . Ldarg_0 ) ;
858- body . EmitCalli ( OpCodes . Calli , CallingConvention . Cdecl , monoMethod . ReturnType . NativeType ( ) ,
859- new [ ] { typeof ( IntPtr ) } . Concat ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) )
860- . ToArray ( ) ) ;
867+ body . Emit ( OpCodes . Ldarg_1 ) ; // methodMetadata
868+ body . Emit ( OpCodes . Ldarg_0 ) ; // methodPointer
869+ body . EmitCalli ( OpCodes . Calli , CallingConvention . Cdecl , monoMethod . ReturnType . NativeType ( ) , GetNativeParameterTypes ( monoMethod ) ) ;
861870
862871 if ( UnityVersionHandler . IsMetadataV29OrHigher )
863872 {
@@ -923,12 +932,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
923932
924933 private static Delegate CreateTrampoline ( MethodInfo monoMethod )
925934 {
926- var nativeParameterTypes = new List < Type > ( ) ;
927- if ( ! monoMethod . IsStatic )
928- nativeParameterTypes . Add ( typeof ( IntPtr ) ) ;
929- nativeParameterTypes . AddRange ( monoMethod . GetParameters ( ) . Select ( it => it . ParameterType . NativeType ( ) ) ) ;
930- nativeParameterTypes . Add ( typeof ( Il2CppMethodInfo * ) ) ;
931-
932935 var managedParameters = new List < Type > ( ) ;
933936 if ( ! monoMethod . IsStatic )
934937 managedParameters . Add ( monoMethod . DeclaringType ) ;
@@ -937,7 +940,7 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
937940 var method = new DynamicMethod (
938941 "Trampoline_" + ExtractSignature ( monoMethod ) + monoMethod . DeclaringType + monoMethod . Name ,
939942 MethodAttributes . Static | MethodAttributes . Public , CallingConventions . Standard ,
940- monoMethod . ReturnType . NativeType ( ) , nativeParameterTypes . ToArray ( ) ,
943+ monoMethod . ReturnType . NativeType ( ) , GetNativeParameterTypes ( monoMethod ) ,
941944 monoMethod . DeclaringType , true ) ;
942945
943946 var signature = new DelegateSupport . MethodSignature ( monoMethod , ! monoMethod . IsStatic ) ;
@@ -957,7 +960,9 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
957960
958961 var indirectVariables = new LocalBuilder [ managedParameters . Count ] ;
959962
960- for ( var i = 1 ; i < managedParameters . Count ; i ++ )
963+ var argOffset = method . IsStatic ? 0 : 1 ;
964+
965+ for ( var i = argOffset ; i < managedParameters . Count ; i ++ )
961966 {
962967 var parameter = managedParameters [ i ] ;
963968 if ( parameter . IsSubclassOf ( typeof ( ValueType ) ) )
@@ -1027,7 +1032,7 @@ void HandleTypeConversion(Type type)
10271032 body . Emit ( OpCodes . Stloc , managedReturnVariable ) ;
10281033 }
10291034
1030- for ( var i = 1 ; i < managedParameters . Count ; i ++ )
1035+ for ( var i = argOffset ; i < managedParameters . Count ; i ++ )
10311036 {
10321037 var variable = indirectVariables [ i ] ;
10331038 if ( variable == null )
0 commit comments