- Notifications
You must be signed in to change notification settings - Fork752
Closed
Description
I noticed that whenPythonEngine.PythonHome
was set and a subsequentInitialize()
call was made my .Net application would close unexpectedly.
It looks like the call toPy_SetPythonHome
made in runtime.cs is implicitly marshalling the string to a char array for the unmanaged code. My suspicion is that the Python sourcecode is keeping a record of the pointer rather than making a copy of the data. The managed runtime will free the memory allocated to char array as soon as the function finishes executing leaving a dangling pointer. This then leads to the unexpectedInitialize()
behaviour.
[DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]internal unsafe static extern voidPy_SetPythonHome(string home);
The solution appears to be to explicitly marshal the string and hang onto the pointer until it is no longer needed, i.e.
[DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]internal unsafe static extern voidPy_SetPythonHome(IntPtr home);
IntPtr str = Marshal.StringToHGlobalAnsi(@"C:\Python27");Py_SetPythonHome(str);// do stuffMarshal.FreeHGlobal(str);
Running Win7, .Net4.5 and Python 2.7.11.
Metadata
Metadata
Assignees
Labels
No labels