@@ -667,8 +667,41 @@ internal unsafe static extern IntPtr
667667 public unsafe static extern int
668668 Py_Main (
669669 int argc ,
670- [ MarshalAs ( UnmanagedType . LPArray , ArraySubType = UnmanagedType . LPWStr ) ] string [ ] argv
670+ [ MarshalAs ( UnmanagedType . SysUInt ) ] IntPtr lplpargv
671671 ) ;
672+
673+ public static int Py_Main ( int argc , string [ ] argv )
674+ {
675+ // Totally ignoring argc.
676+ argc = argv. Length;
677+
678+ var allStringsLength = 0 ;
679+ foreach ( string x in argv)
680+ {
681+ allStringsLength += x . Length + 1 ;
682+ }
683+ int requiredSize = IntPtr . Size * argc + allStringsLength * UCS ;
684+ IntPtr mem = Marshal . AllocHGlobal ( requiredSize ) ;
685+ try
686+ {
687+ // Preparing array of pointers to UTF32 strings.
688+ IntPtr curStrPtr = mem + argc * IntPtr. Size;
689+ for ( var i = 0 ; i < argv . Length ; i++ )
690+ {
691+ // Unicode or UTF8 work
692+ Encoding enc = UCS == 2 ? Encoding. Unicode : Encoding. UTF32;
693+ byte [ ] zstr = enc. GetBytes( argv [ i ] + "\0 " ) ;
694+ Marshal. Copy ( zstr , 0 , curStrPtr , zstr . Length ) ;
695+ Marshal. WriteIntPtr ( mem + IntPtr . Size * i , curStrPtr ) ;
696+ curStrPtr += zstr. Length ;
697+ }
698+ return Py_Main( argc , mem ) ;
699+ }
700+ finally
701+ {
702+ Marshal. FreeHGlobal ( mem ) ;
703+ }
704+ }
672705#elif PYTHON2
673706 [ DllImport ( Runtime . dll , CallingConvention = CallingConvention . Cdecl ,
674707 ExactSpelling = true , CharSet = CharSet . Ansi ) ]
@@ -2084,9 +2117,41 @@ internal unsafe static extern IntPtr
20842117 internal unsafe static extern void
20852118 PySys_SetArgvEx (
20862119 int argc ,
2087- [ MarshalAs ( UnmanagedType . LPArray , ArraySubType = UnmanagedType . LPWStr ) ] string [ ] argv ,
2120+ [ MarshalAs ( UnmanagedType . SysUInt ) ] IntPtr lplpargv ,
20882121 int updatepath
20892122 ) ;
2123+
2124+ internal static void PySys_SetArgvEx ( int argc , string [ ] argv , int updatepath )
2125+ {
2126+ // Totally ignoring argc.
2127+ argc = argv. Length;
2128+
2129+ var allStringsLength = 0 ;
2130+ foreach ( string x in argv)
2131+ {
2132+ allStringsLength += x. Length + 1 ;
2133+ }
2134+ int requiredSize = IntPtr. Size * argc + allStringsLength * UCS;
2135+ IntPtr mem = Marshal. AllocHGlobal( requiredSize ) ;
2136+ try
2137+ {
2138+ // Preparing array of pointers to UTF32 strings.
2139+ IntPtr curStrPtr = mem + argc * IntPtr. Size;
2140+ for ( var i = 0 ; i < argv. Length; i++ )
2141+ {
2142+ Encoding enc = UCS == 2 ? Encoding. Unicode : Encoding. UTF32;
2143+ byte [ ] zstr = enc. GetBytes( argv [ i ] + "\0 " ) ;
2144+ Marshal. Copy ( zstr , 0 , curStrPtr , zstr . Length ) ;
2145+ Marshal. WriteIntPtr ( mem + IntPtr . Size * i , curStrPtr ) ;
2146+ curStrPtr += zstr. Length ;
2147+ }
2148+ PySys_SetArgvEx( argc , mem , updatepath ) ;
2149+ }
2150+ finally
2151+ {
2152+ Marshal. FreeHGlobal ( mem ) ;
2153+ }
2154+ }
20902155#elif PYTHON2
20912156 [ DllImport ( Runtime . dll , CallingConvention = CallingConvention . Cdecl ,
20922157 ExactSpelling = true , CharSet = CharSet . Ansi ) ]
0 commit comments