Crash when using nested classes with inheritance, which are instantiated from C#
Environment
- Pythonnet version: 2.5.1
- Python version: Python 3.9.2
- Operating System: MacOS
- .NET Runtime: 5.0.200
Details
- Describe what you were trying to get done.
I am accessing a member of a nested C# class which inherits from the enclosing class.
When doing this, the Pythonnet runtime crashes!
Here is a minimal example:
namespace pythonnet_testing { public class Bar { public class Hej : Bar { } } public class Foo { public Bar Bar; public static Foo Create() { Foo f = new(); f.Bar = new Bar.Hej(); return f; } } class Program { static void Main(string[] args) { var pyCode = @" import pythonnet_testing f = pythonnet_testing.Foo.Create() print('Trying to access member of nested subclass') print(f'Bar: {f.Bar}') "; PythonEngine.Initialize(); using (Py.GIL()) { PythonEngine.Exec(pyCode); } Console.WriteLine("EXIT"); } } }
This seem to be specifically for nested classes, where the object instance is created from the C# environment, and the class has not been explicitly referenced/used from python.
I have found a way to prevent the crash, by first explicitly using the nested class in the python code.
Eg instead of this:
import pythonnet_testing f = pythonnet_testing.Foo.Create() print('Trying to access member of nested subclass') print(f'Bar: {f.Bar}')
I insert a reference to the nested Bar.Hej class
import pythonnet_testing f = pythonnet_testing.Foo.Create() print('Trying to access member of nested subclass') _ = pythonnet_testing.Bar.Hej # Explicitly referencing the nested class print(f'Bar: {f.Bar}')
If I do this, then the Pythonnet runtime no longer crashes. It is even enough to reference the enclosing baseclass Bar
_ = pythonnet_testing.Bar # Explicitly referencing the enclosing class print(f'Bar: {f.Bar}')
When I do this, the python code executes properly:
Trying to access member of nested subclass
Bar: pythonnet_testing.Bar+Hej