8000 Crash when using nested classes with inheritance, which are instantiated from C# · Issue #1414 · pythonnet/pythonnet · GitHub
[go: up one dir, main page]

Skip to content
Crash when using nested classes with inheritance, which are instantiated from C# #1414
Closed
@koliyo

Description

@koliyo

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    0