C#编组动态长度字符串
我有动态长度的结构体:C#编组动态长度字符串
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct PktAck
{
public Int32 code;
[MarshalAs(UnmanagedType.LPStr)]
public string text;
}
当我转换字节[]通过这个代码为结构:
GCHandle handle = GCHandle.Alloc(bytes_array, GCHandleType.Pinned);
result_struct = (PktAck)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PktAck));
handle.Free();
我有一个错误,因为结构小于字节[]和“字符串文本”的大小的大小是指向字符串的指针...
如何使用动态字符串? 或者我只能使用这样的事情:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)]
UPD: C结构
struct PktAck
{
int code;
char* text;
}
如果你想元帅这一结构成的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);
}
}
我想将字节数组转换为此结构和结构数组返回。 我有一个这样做的函数,但是这个函数不适用于动态结构。 – mitsky 2010-05-28 15:30:02
一旦你改变stuct使用'IntPtr'而不是'string',那么它将有一个固定的大小。之后,Marshal.PtrToStructure调用应该可以工作。 – 2010-05-28 16:15:17
这一个应该被标记为答案。否则OP应该提供更多信息来精心设计。 – 2015-06-23 10:56:29
请向我们展示C'struct'。 – SLaks 2010-05-28 14:23:45
嗨, 我有同样的问题。 你有解决方法吗? 谢谢, Ofir – Ofir 2011-01-30 16:47:01