1
1
using System ;
2
+ using System . Linq ;
2
3
using System . Runtime . InteropServices ;
3
4
using System . Text ;
4
5
@@ -41,23 +42,18 @@ public int GetNativeDataSize()
41
42
public class StrMarshaler : MarshalerBase
42
43
{
43
44
private static readonly MarshalerBase Instance = new StrMarshaler ( ) ;
45
+ private static readonly Encoding PyEncoding = Runtime . UCS == 2 ? Encoding . Unicode : Encoding . UTF32 ;
44
46
45
47
public override IntPtr MarshalManagedToNative ( object managedObj )
46
48
{
47
- Encoding encoding = Runtime . UCS == 2 ? Encoding . Unicode : Encoding . UTF32 ;
48
49
var s = managedObj as string ;
49
50
50
51
if ( s == null )
51
52
{
52
53
return IntPtr . Zero ;
53
54
}
54
55
55
- int minByteCount = encoding . GetMaxByteCount ( 1 ) ;
56
- char [ ] cStr = s . ToCharArray ( 0 , s . Length ) ;
57
- byte [ ] bStr = new byte [ encoding . GetByteCount ( cStr ) + minByteCount ] ;
58
- encoding . GetBytes ( cStr , 0 , cStr . Length , bStr , 0 ) ;
59
- DebugUtil . PrintHexBytes ( bStr ) ;
60
-
56
+ byte [ ] bStr = PyEncoding . GetBytes ( s + "\0 " ) ;
61
57
IntPtr mem = Marshal . AllocHGlobal ( bStr . Length ) ;
62
58
try
63
59
{
@@ -86,6 +82,7 @@ public static ICustomMarshaler GetInstance(string cookie)
86
82
public class StrArrayMarshaler : MarshalerBase
87
83
{
88
84
private static readonly MarshalerBase Instance = new StrArrayMarshaler ( ) ;
85
+ private static readonly Encoding PyEncoding = Runtime . UCS == 2 ? Encoding . Unicode : Encoding . UTF32 ;
89
86
90
87
public override IntPtr MarshalManagedToNative ( object managedObj )
91
88
{
@@ -96,11 +93,7 @@ public override IntPtr MarshalManagedToNative(object managedObj)
96
93
return IntPtr . Zero ;
97
94
}
98
95
99
- var totalStrLength = 0 ;
100
- foreach ( string arg in argv )
101
- {
102
- totalStrLength += arg . Length + 1 ;
103
- }
96
+ int totalStrLength = argv . Sum ( arg => arg . Length + 1 ) ;
104
97
int memSize = argv . Length * IntPtr . Size + totalStrLength * Runtime . UCS ;
105
98
106
99
IntPtr mem = Marshal . AllocHGlobal ( memSize ) ;
@@ -110,8 +103,7 @@ public override IntPtr MarshalManagedToNative(object managedObj)
110
103
IntPtr curStrPtr = mem + argv . Length * IntPtr . Size ;
111
104
for ( var i = 0 ; i < argv . Length ; i ++ )
112
105
{
113
- Encoding encoding = Runtime . UCS == 2 ? Encoding . Unicode : Encoding . UTF32 ;
114
- byte [ ] bStr = encoding . GetBytes ( argv [ i ] + "\0 " ) ;
106
+ byte [ ] bStr = PyEncoding . GetBytes ( argv [ i ] + "\0 " ) ;
115
107
Marshal . Copy ( bStr , 0 , curStrPtr , bStr . Length ) ;
116
108
Marshal . WriteIntPtr ( mem + i * IntPtr . Size , curStrPtr ) ;
117
109
curStrPtr += bStr . Length ;
0 commit comments