Closed
Description
Environment
- Pythonnet version: 2.5.1
- Python version: 3.6.5
- Operating System: Windows 10
- .NET Runtime: 4.8.4250.0
Details
- When I try to invoke a .NET event that takes a
ref
parameter, the python process crashes. I provided the code to reproduce the issue below.
Note: I cannot change the code to not use ref
as the ref
delegate is coming from a 3rd party library. I can wrap around it with a lightweight C# piece of code but would rather avoid it if possible.
Note: This may be related to the following issue: #965
Windows Event Viewer Error 1: Source - .NET Runtime
Application: python.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an internal error in the .NET Runtime at IP 00007FF81CEA3D2E (00007FF81CEA0000) with exit code 80131506.
Windows Event Viewer Error 2: Source - Application Error
Faulting application name: python.exe, version: 3.6.5150.1013, time stamp: 0x5abbcb08
Faulting module name: clr.dll, version: 4.8.4250.0, time stamp: 0x5f2a059c
Exception code: 0xc0000005
Fault offset: 0x0000000000003d2e
Faulting process id: 0x4348
Faulting application start time: 0x01d6eaa4a034a863
Faulting application path: C:\Users\noam.bonnie\dev\hp-bluetooth-service\.tox\py36\Scripts\python.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: c2031029-3b2f-4e61-aa84-5e5502e904d2
Faulting package full name:
Faulting package-relative application ID:
The C# class with ref
parameter for the delegate. Removing the ref
resolves the problem
using System;
namespace TestEvent
{
public delegate void MyEvent(ref string data);
public class MyTest
{
public event MyEvent myEvent;
public virtual void triggerEvent()
{
Console.WriteLine("Invoking Event!");
string myStr = "This is the event data";
myEvent?.Invoke(ref myStr);
}
}
}
Python program to invoke the event. Crashes.
import clr
import os
import sys
def handleEventData(data):
print("=== event invoked. data: {} ===".format(data))
try:
# load the library of the C# class above from a 'lib' local directory.
# not necessary if the library of the C# dll is in the path
lib_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib')
sys.path.append(lib_path)
clr.AddReference("TestEvent")
clr.AddReference("System")
# Print the .NET version
import System
print(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription)
# Create object, subscribe to event and trigger the event
import TestEvent
t = TestEvent.MyTest()
t.myEvent += handleEventData
t.triggerEvent()
except Exception as e:
print(e)
Metadata
Metadata
Assignees
Labels
No labels