c#封送动态长度字符串

c#封送动态长度字符串,c#,.net,string,dynamic,marshalling,C#,.net,String,Dynamic,Marshalling,我有一个动态长度的结构: [StructLayout(LayoutKind.Sequential, Pack = 1)] struct PktAck { public Int32 code; [MarshalAs(UnmanagedType.LPStr)] public string text; } 通过此代码将字节[]转换为结构时: GCHandle handle = GCHandle.Alloc(bytes_array, GCHa

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

   [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();
我有一个错误,因为struct的大小小于bytes[]的大小,“string text”是指向字符串的指针

如何使用动态字符串? 或者我只能用这样的东西:

  [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)]
upd:c结构

   struct PktAck
   {
       int code;
       char* text;
   }

如果您想将此结构封送到PInvoke调用中,那么我将使用
封送
类来分配字符串

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

请给我们看C
struct
。嗨,我也有同样的问题。你找到解决办法了吗?谢谢,Ofiri想把字节数组转换成这个结构,把结构转换成数组。我有一个函数可以执行此操作,但此函数在dynamic struct上不起作用。一旦您将stuct更改为使用
IntPtr
而不是
string
,它将具有固定大小。在此之后,
Marshal.PtrToStructure
调用应该工作。这个调用应该标记为应答。否则,OP应向ellaborate提供更多信息以获得一个。