c#编组动态长度字符串

时间:2010-05-28 13:19:37

标签: c# .net string dynamic marshalling

我有一个动态长度的结构:

   [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;
   }

1 个答案:

答案 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);
  }
}