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