Open
Description
Environment
- Pythonnet version: 3.0.4
- Python version: 3.10.12
- Operating System: Ubuntu 22.04 LTS
- .NET Runtime: Mono 6.12.0.200 (tarball)
Details
- Describe what you were trying to get done.
I've stumbled upon an exception when creating a Type in Python from a C# interface that includes a generic return type (example code below)
- What commands did you run to trigger this issue? If you can provide a
Minimal, Complete, and Verifiable example
this will help us understand the issue.
namespace Robin
{
public interface IRobin
{
T? Find<T>() where T : IRobin;
}
}
Converted to a DLL using: csc /t:library IRobin.cs
Then bug validated with:
import sys
import os
import pythonnet
print(__file__)
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
import clr
clr.AddReference("IRobin")
from Robin import IRobin
print(pythonnet.get_runtime_info())
class A(IRobin):
__namespace__ = "mock"
- If there was a crash, please include the traceback here.
TypeError: Failed to create Python type for mock.A
I modified the Pythonnet.dll to console error the C# exception and I get:
Python.Runtime.InternalPythonnetException: Failed to create Python type for mock.A ---> System.TypeLoadException: VTable setup of type mock.A failed
at (wrapper managed-to-native) System.RuntimeType.GetMethodsByName_native(System.RuntimeType,intptr,System.Reflection.BindingFlags,System.RuntimeType/MemberListType)
at System.RuntimeType.GetMethodsByName (System.String name, System.Reflection.BindingFlags bindingAttr, System.RuntimeType+MemberListType listType, System.RuntimeType reflectedType) [0x0001b] in <d636f104d58046fd9b195699bcb1a744>:0
at System.RuntimeType.GetMethodCandidates (System.String name, System.Reflection.BindingFlags bindingAttr, System.Reflection.CallingConventions callConv, System.Type[] types, System.Int32 genericParamCount, System.Boolean allowPrefixLookup) [0x00010] in <d636f104d58046fd9b195699bcb1a744>:0
at System.RuntimeType.GetMembers (System.Reflection.BindingFlags bindingAttr) [0x00000] in <d636f104d58046fd9b195699bcb1a744>:0
at Python.Runtime.ClassManager.GetClassInfo (System.Type type, Python.Runtime.ClassBase impl) [0x00028] in <2aa3218182dd47ff892dddbce801f07b>:0
at Python.Runtime.ClassManager.InitClassBase (System.Type type, Python.Runtime.ClassBase impl, Python.Runtime.ReflectedClrType pyType) [0x00001] in <2aa3218182dd47ff892dddbce801f07b>:0
at Python.Runtime.ReflectedClrType.GetOrCreate (System.Type type) [0x00047] in <2aa3218182dd47ff892dddbce801f07b>:0
--- End of inner exception stack trace ---
at Python.Runtime.ReflectedClrType.GetOrCreate (System.Type type) [0x00076] in <2aa3218182dd47ff892dddbce801f07b>:0
at Python.Runtime.ReflectedClrType.CreateSubclass (Python.Runtime.ClassBase baseClass, System.Collections.Generic.IList`1[T] interfaces, System.String name, System.String assembly, System.String ns, Python.Runtime.BorrowedReference dict) [0x0001f] in <2aa3218182dd47ff892dddbce801f07b>:0 Traceback (most recent call last):
With a bit more console out I found the issue is when we try to get the members of the Python class: https://github.com/pythonnet/pythonnet/blob/v3.0.4/src/runtime/ClassManager.cs#L344
Metadata
Metadata
Assignees
Labels
No labels