Skip to content

Crash when using nested classes with inheritance, which are instantiated from C# #1414

@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

    pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy