【问题标题】:c# marshaling dynamic-length stringc# 编组动态长度字符串
【发布时间】:2010-05-28 13:19:37
【问题描述】:

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

   [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)]

更新: c 结构

   struct PktAck
   {
       int code;
       char* text;
   }

【问题讨论】:

  • 请给我们看C struct
  • 嗨,我也有同样的问题。你得到解决方案了吗?谢谢,Ofir

标签: c# .net string dynamic marshalling


【解决方案1】:

如果您想将此结构编组到 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);
  }
}

【讨论】:

  • 我想将字节数组转换为这个结构,然后将结构转换回数组。我有一个函数可以做到这一点,但这个函数不适用于动态结构。
  • 一旦您将结构更改为使用IntPtr 而不是string,那么它将具有固定大小。 Marshal.PtrToStructure 调用应该在那之后工作。
  • 这个应该被标记为答案。否则,OP 应该提供更多信息来详细说明以获得一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多