Crash on Event invocation with ref parameter
See original GitHub issueEnvironment
- 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: https://github.com/pythonnet/pythonnet/issues/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)
Issue Analytics
- State:
- Created 3 years ago
- Comments:7 (5 by maintainers)
Top Results From Across the Web
c# - Crash from Invoke when MainForm is Disposed in ...
In the UI thread I raise the event FormClosing() whenever the application is closing down (through X button or Application.Exit() etc.). In ...
Read more >logEvent causes a crash when an array containing ...
App crashes when trying to log and event where we send as a parameter an Array containing a custom class, even though the...
Read more >Change Invocation Event
You can change the way Instabug is invoked at runtime using this method. This method takes any number of Invocation Events as an...
Read more >Error handling and automatic retries in AWS Lambda
Common invocation errors. Request – The request event is too large or isn't valid JSON, the function doesn't exist, or a parameter value...
Read more >Exception Has Been Thrown by the target of an invocation ...
The issue to my problem was an event handler that was leftover from Xamarin Forms. It had incorrect parameter. There was no report...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Not related to the issue, but in .NET strings are pointers, so passing them does not make a copy of the characters, but only of the pointer…
handleEventData
that you wrote will work, as long as it returns the new value ofdata
. Since you said you don’t want to changedata
, just addreturn data
to the end. See https://pythonnet.github.io/ for the full explanation, and test-event.py for more examples.