我有一个动态长度的结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct PktAck
{
public Int32 code;
[MarshalAs(UnmanagedType.LPStr)]
public string text;
}
当我通过此代码将bytes []转换为struct时:
GCHandle handle = GCHandle.Alloc(bytes_array, GCHandleType.Pinned);
result_struct = (PktAck)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PktAck));
handle.Free();
我有一个错误,因为struct的大小小于bytes []和“string text”的大小是指向字符串的指针......
我如何使用动态字符串? 或者我只能使用这样的东西:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)]
upd: c struct
struct PktAck
{
int code;
char* text;
}
答案 0 :(得分:0)
如果您想将此结构编组到PInvoke调用中,那么我将使用Marshal
类来分配字符串。
struct PktAck
{
public Int32 code;
public IntPtr text;
}
public static void Main()
{
var a = new PktAck();
a.code = 314159;
a.text = Marshal.StringToHGlobalAnsi("foo");
try
{
SomePInvokeCall(a);
}
finally
{
Marshal.FreeHGlobal(a.text);
}
}