@@ -436,6 +436,7 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild
436436il . Emit ( OpCodes . Ldloc_0 ) ;
437437
438438il . Emit ( OpCodes . Ldtoken , method ) ;
439+ il . Emit ( OpCodes . Ldtoken , method . DeclaringType ) ;
439440#pragma warning disableCS0618 // PythonDerivedType is for internal use only
440441if ( method . ReturnType == typeof ( void ) )
441442{
@@ -505,6 +506,7 @@ private static void AddPythonMethod(string methodName, PyObject func, TypeBuilde
505506
506507il . DeclareLocal ( typeof ( object [ ] ) ) ;
507508il . DeclareLocal ( typeof ( RuntimeMethodHandle ) ) ;
509+ il . DeclareLocal ( typeof ( RuntimeTypeHandle ) ) ;
508510
509511// this
510512il . Emit ( OpCodes . Ldarg_0 ) ;
@@ -546,6 +548,11 @@ private static void AddPythonMethod(string methodName, PyObject func, TypeBuilde
546548il . Emit ( OpCodes . Ldloca_S , 1 ) ;
547549il . Emit ( OpCodes . Initobj , typeof ( RuntimeMethodHandle ) ) ;
548550il . Emit ( OpCodes . Ldloc_1 ) ;
551+
552+ // type handle is also not required
553+ il . Emit ( OpCodes . Ldloca_S , 2 ) ;
554+ il . Emit ( OpCodes . Initobj , typeof ( RuntimeTypeHandle ) ) ;
555+ il . Emit ( OpCodes . Ldloc_2 ) ;
549556#pragma warning disableCS0618 // PythonDerivedType is for internal use only
550557
551558// invoke the method
@@ -698,7 +705,7 @@ public class PythonDerivedType
698705/// class) it calls it, otherwise it calls the base method.
699706/// </summary>
700707public static T ? InvokeMethod < T > ( IPythonDerivedType obj , string methodName , string origMethodName ,
701- object [ ] args , RuntimeMethodHandle methodHandle )
708+ object [ ] args , RuntimeMethodHandle methodHandle , RuntimeTypeHandle declaringTypeHandle )
702709{
703710var self = GetPyObj ( obj ) ;
704711
@@ -724,7 +731,10 @@ public class PythonDerivedType
724731}
725732
726733PyObject py_result = method . Invoke ( pyargs ) ;
727- PyTuple ? result_tuple = MarshalByRefsBack ( args , methodHandle , py_result , outsOffset : 1 ) ;
734+ var clrMethod = methodHandle != default
735+ ? MethodBase . GetMethodFromHandle ( methodHandle , declaringTypeHandle )
736+ : null ;
737+ PyTuple ? result_tuple = MarshalByRefsBack ( args , clrMethod , py_result , outsOffset : 1 ) ;
728738return result_tuple is notnull
729739? result_tuple [ 0 ] . As < T > ( )
730740: py_result . As < T > ( ) ;
@@ -754,7 +764,7 @@ public class PythonDerivedType
754764}
755765
756766public static void InvokeMethodVoid ( IPythonDerivedType obj , string methodName , string origMethodName ,
757- object ? [ ] args , RuntimeMethodHandle methodHandle )
767+ object ? [ ] args , RuntimeMethodHandle methodHandle , RuntimeTypeHandle declaringTypeHandle )
758768{
759769var self = GetPyObj ( obj ) ;
760770if ( null != self . Ref )
@@ -779,7 +789,10 @@ public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, s
779789}
780790
781791PyObject py_result = method . Invoke ( pyargs ) ;
782- MarshalByRefsBack ( args , methodHandle , py_result , outsOffset : 0 ) ;
792+ var clrMethod = methodHandle != default
793+ ? MethodBase . GetMethodFromHandle ( methodHandle , declaringTypeHandle )
794+ : null ;
795+ MarshalByRefsBack ( args , clrMethod , py_result , outsOffset : 0 ) ;
783796return ;
784797}
785798}
@@ -811,12 +824,11 @@ public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, s
811824/// as a tuple of new values for those arguments, and updates corresponding
812825/// elements of <paramref name="args"/> array.
813826/// </summary>
814- private static PyTuple ? MarshalByRefsBack ( object ? [ ] args , RuntimeMethodHandle methodHandle , PyObject pyResult , int outsOffset )
827+ private static PyTuple ? MarshalByRefsBack ( object ? [ ] args , MethodBase ? method , PyObject pyResult , int outsOffset )
815828{
816- if ( methodHandle == default ) return null ;
829+ if ( method is null ) return null ;
817830
818- var originalMethod = MethodBase . GetMethodFromHandle ( methodHandle ) ;
819- var parameters = originalMethod . GetParameters ( ) ;
831+ var parameters = method . GetParameters ( ) ;
820832PyTuple ? outs = null ;
821833int byrefIndex = 0 ;
822834for ( int i = 0 ; i < parameters . Length ; ++ i )