Description
I noticed that when PythonEngine.PythonHome
was set and a subsequent Initialize()
call was made my .Net application would close unexpectedly.
It looks like the call to Py_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 unexpected Initialize()
behaviour.
[DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl,
ExactSpelling = true, CharSet = CharSet.Ansi)]
internal unsafe static extern void
Py_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 void
Py_SetPythonHome(IntPtr home);
IntPtr str = Marshal.StringToHGlobalAnsi(@"C:\Python27");
Py_SetPythonHome(str);
// do stuff
Marshal.FreeHGlobal(str);
Running Win7, .Net4.5 and Python 2.7.11.