111,098
社区成员




if (i > 0 && (i % 2 == 0))
{
user_name = System.Text.Encoding.Unicode.GetString(userName, 0, i);
}
else
{
byte[] bytes = new byte[i + 1];
for (int j = 0; j < i; j++)
{
bytes[j] =userName[j];
}
user_name = System.Text.Encoding.Unicode.GetString(bytes, 0, i + 1);
}
将这段添加到[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct User
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public string user_name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public string user_email;
public User(byte[ ] userName,byte[ ] userEmail)
{
int i = 0;
for (i = 0; i < userName.Length; i++)
{
if (userName[i] == 0)
break;
}
user_name = System.Text.Encoding.Unicode.GetString(userName, 0, i);
int i = 0;
for (i = 0; i < userEmail.Length; i++)
{
if (userEmail[i] == 0)
break;
}
user_email = System.Text.Encoding.Unicode.GetString(userEmail, 0, i);
}
}
引用的时候new两个带byte数组的参数就行,而且要保证参数为UTF8 object ICustomMarshaler.MarshalNativeToManaged(IntPtr pNativeData)
{
List<byte> buffer = new List<byte>();
int index = 0;
while (true)
{
var data = Marshal.ReadByte(pNativeData, index++);
if (data == 0)
{
break;
}
buffer.Add(data);
}
return Encoding.UTF8.GetString(buffer.ToArray());
}