Calling overridden method with out parameter from C# to python results in 0xC0000005 (Access Violation)
Environment
- Pythonnet version: 2.5.2
- Python version: 3.8.3
- Operating System: Win10 64bit
- .NET Runtime: 4.8
Details
- Describe what you were trying to get done.
In C# I have defined an interface with a method with an out parameter. I implemented this interface in python, an now I want to call this method from C#. (using pythonnet)
What I see is that a method without out parameter works fine, but a method with an out parameter throws an access violation.
I know that out parameters are handled differently in pythonnet: you return a tuple with first the return value and the second tuple item is the out parameter.
- 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.
My C# code
public interface IMyInterface { string MyMethod_Out(string name, out int index); string MyMethod(string name); } public class MyServer { public void CallMyMethod_Out(IMyInterface myInterface) { Console.WriteLine("C#.CallMyMethod_Out: before MyMethod_Out"); int index = 1; myInterface.MyMethod_Out("myclient", out index); Console.WriteLine($"C#:CallMyMethod_Out: after MyMethod_Out: index:{index}"); } public void CallMyMethod(IMyInterface myInterface) { Console.WriteLine("C#.CallMyMethod: before MyMethod"); myInterface.MyMethod("myclient"); Console.WriteLine($"C#:CallMyMethod: after MyMethod"); } public void DoSomething() { Console.WriteLine("C#.DoSomething"); } }
My Python code:
import clr import sys sys.path.append('some_dir') clr.AddReference("ClassLibrary1") from ClassLibrary1 import IMyInterface, MyServer class MyInterfaceImpl(IMyInterface): __namespace__ = "ClassLibrary1" def MyMethod_Out(self, name, index): print("Python.MyInterfaceImpl.MyMethod_Out") other_index = 101 return ('MyName', other_index) def MyMethod(self, name): print("Python.MyInterfaceImpl.MyMethod") return 'MyName' print('\nCall regular C# function') my_server = MyServer() my_server.DoSomething() my_interface_impl = MyInterfaceImpl() print('\nCall without out param') my_server.CallMyMethod(my_interface_impl) print('\nCall with out param') my_server.CallMyMethod_Out(my_interface_impl) # Access Violation 0xC0000005
- If there was a crash, please include the traceback here.
Output:
Call regular C# function
C#.DoSomethingCall without out param
C#.CallMyMethod: before MyMethod
Python.MyInterfaceImpl.MyMethod
C#:CallMyMethod: after MyMethodCall with out param
C#.CallMyMethod_Out: before MyMethod_Out
Process finished with exit code -1073741819 (0xC0000005)
Expected output
...
Call with out param
C#.CallMyMethod_Out: before MyMethod_Out
Python.MyInterfaceImpl.MyMethod_Out
C#:CallMyMethod_Out: after MyMethod_Out: index:101