@@ -818,6 +818,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
818
818
return CreateTrampoline ( monoMethod ) ;
819
819
}
820
820
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
+
821
831
private static Delegate CreateInvoker ( MethodInfo monoMethod )
822
832
{
823
833
DynamicMethod method ;
@@ -841,11 +851,11 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
841
851
var body = method . GetILGenerator ( ) ;
842
852
843
853
if ( ! monoMethod . IsStatic )
844
- body . Emit ( OpCodes . Ldarg_2 ) ;
854
+ body . Emit ( OpCodes . Ldarg_2 ) ; // obj
845
855
for ( var i = 0 ; i < monoMethod . GetParameters ( ) . Length ; i ++ )
846
856
{
847
857
var parameterInfo = monoMethod . GetParameters ( ) [ i ] ;
848
- body . Emit ( OpCodes . Ldarg_3 ) ;
858
+ body . Emit ( OpCodes . Ldarg_3 ) ; // args
849
859
body . Emit ( OpCodes . Ldc_I4 , i * IntPtr . Size ) ;
850
860
body . Emit ( OpCodes . Add_Ovf_Un ) ;
851
861
var nativeType = parameterInfo . ParameterType . NativeType ( ) ;
@@ -854,10 +864,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
854
864
body . Emit ( OpCodes . Ldobj , nativeType ) ;
855
865
}
856
866
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 ) ) ;
861
870
862
871
if ( UnityVersionHandler . IsMetadataV29OrHigher )
863
872
{
@@ -923,12 +932,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
923
932
924
933
private static Delegate CreateTrampoline ( MethodInfo monoMethod )
925
934
{
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
-
932
935
var managedParameters = new List < Type > ( ) ;
933
936
if ( ! monoMethod . IsStatic )
934
937
managedParameters . Add ( monoMethod . DeclaringType ) ;
@@ -937,7 +940,7 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
937
940
var method = new DynamicMethod (
938
941
"Trampoline_" + ExtractSignature ( monoMethod ) + monoMethod . DeclaringType + monoMethod . Name ,
939
942
MethodAttributes . Static | MethodAttributes . Public , CallingConventions . Standard ,
940
- monoMethod . ReturnType . NativeType ( ) , nativeParameterTypes . ToArray ( ) ,
943
+ monoMethod . ReturnType . NativeType ( ) , GetNativeParameterTypes ( monoMethod ) ,
941
944
monoMethod . DeclaringType , true ) ;
942
945
943
946
var signature = new DelegateSupport . MethodSignature ( monoMethod , ! monoMethod . IsStatic ) ;
@@ -957,7 +960,9 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
957
960
958
961
var indirectVariables = new LocalBuilder [ managedParameters . Count ] ;
959
962
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 ++ )
961
966
{
962
967
var parameter = managedParameters [ i ] ;
963
968
if ( parameter . IsSubclassOf ( typeof ( ValueType ) ) )
@@ -1027,7 +1032,7 @@ void HandleTypeConversion(Type type)
1027
1032
body . Emit ( OpCodes . Stloc , managedReturnVariable ) ;
1028
1033
}
1029
1034
1030
- for ( var i = 1 ; i < managedParameters . Count ; i ++ )
1035
+ for ( var i = argOffset ; i < managedParameters . Count ; i ++ )
1031
1036
{
1032
1037
var variable = indirectVariables [ i ] ;
1033
1038
if ( variable == null )
0 commit comments