C# 封送windows CE结构中的字符数组
如何封送以下结构定义中的字符数组?在.Net CompactFramework中(适用于Windows CE) //事务请求结构C# 封送windows CE结构中的字符数组,c#,compact-framework,pinvoke,C#,Compact Framework,Pinvoke,如何封送以下结构定义中的字符数组?在.Net CompactFramework中(适用于Windows CE) //事务请求结构 typedef struct _VXN_REQUEST { char DID [33]; char MID [33]; char TID [33]; char ClientRef [33]; char Payload [8192]; ULO
typedef struct _VXN_REQUEST
{
char DID [33];
char MID [33];
char TID [33];
char ClientRef [33];
char Payload [8192];
ULONG PayloadLength;
} VXN_REQUEST, *LPVXN_REQUEST;
我试着这样整理它,但似乎不起作用
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
public struct VXN_REQUEST
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string DID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string MID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string TID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string ClientRef;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string Payload;
public uint PayloadLength;
}
也像这样尝试过,但都不起作用,本机代码将其作为单个字符
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct VXN_REQUEST
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]
public char[] DID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]
public char[] MID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]
public char[] TID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]
public char[] ClientRef;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 33)]
public char[] Payload;
public uint PayloadLength;
}
NET字符需要两个字节,它存储以utf-16编码的Unicode代码点。在声明中使用byte而不是char。如果您确实需要将这些字段设置为字符串,请使用Encoding.ASCII.GetBytes()填充字节[]。将您的p/Invoke声明更改为接受字节[]而不是结构,然后按如下方式定义它:
public class VXN_REQUEST
{
private byte[] m_data;
public const int Size = 8328;
public VXN_REQUEST()
{
m_data = new byte[Size];
}
public static implicit operator byte[](VXN_REQUEST req)
{
return req.m_data;
}
public string DID
{
get { return Encoding.ASCII.GetString(m_data, 0, 33).Trim('\0'); }
set
{
// TODO: verify that 'value' isn't too long
// first clear the contents
var empty = new byte[33];
Buffer.BlockCopy(empty, 0, m_data, 0, empty.Length);
// copy data
Encoding.ASCII.GetBytes(value).CopyTo(m_data, 0);
}
}
public string MID
{
get { return Encoding.ASCII.GetString(m_data, 33, 33).Trim('\0'); }
}
public string TID
{
get { return Encoding.ASCII.GetString(m_data, 66, 33).Trim('\0'); }
}
public string ClientRef
{
get { return Encoding.ASCII.GetString(m_data, 99, 33).Trim('\0'); }
}
public string Payload
{
get { return Encoding.ASCII.GetString(m_data, 132, PayloadLength).Trim('\0'); }
}
public int PayloadLength
{
get { return BitConverter.ToInt32(m_data, 8324); }
}
}
作为记录,33个字符的长度对我来说真的很奇怪。感谢Ctacke,我认为这可能会起作用,但为什么属性是只读的,我需要将值传递给本机。我编辑了代码,并为DID成员添加了一个setter。只需将其复制到其他属性中,调整有效负载的偏移量和长度。感谢Ctacke,我很欣赏CTackle,这个类是否会直接封送到与结构相同的本机结构,如[MarshalAs(UnmanagedType.struct)]ref VXN_REQUEST lpVxnRequest,有些人认为它似乎无法将值传递给本机代码。did、mid等字符串是否能够在.netcompact框架中作为char[]封送到nativecode