代码之家  ›  专栏  ›  技术社区  ›  RandomEngy

封送结构同时保持其“非托管”

  •  0
  • RandomEngy  · 技术社区  · 16 年前

    我正在对一个DLL进行p调用,该DLL返回一个void**结构指针列表,所有指针都是相同类型的。 From what I've read ,为了强制转换并从该列表中删除我的结构,需要将该结构视为非托管结构。我试图封送的结构的主要元凶是C端的以下两个字段:

    char name[1024];
    int crop[4];
    

    还有什么方法可以封送这些字段以获得非托管结构?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    如果您这样声明,该结构将在不需要帮助或不安全关键字的情况下封送:

    using System.Runtime.InteropServices;
    ...
      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
      public struct Example {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
        public string name;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        int[] crop;
      }
    

        2
  •  1
  •   dtb    16 年前

    fixed 用于在数据结构中使用固定大小数组创建缓冲区的关键字:

    unsafe struct Foo
    {
        public fixed byte name[1024];
        public fixed int crop[4];
    }
    
    static unsafe void DumpCrops(void** ptr, int count)
    {
        Foo** p = (Foo**)ptr;
    
        for (int i = 0; i < count; i++)
        {
            Foo* f = p[i];
    
            for (int j = 0; j < 4; j++)
            {
                Console.WriteLine(f->crop[j]);
            }
        }
    }
    
        3
  •  0
  •   t0mm13b    16 年前

    您需要在结构上的该点添加一条线,如图所示。。。

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public unsafe struct _FOOBAR {
        [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 1024, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I2)]
    char name[1024];
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = System.Runtime.InteropServices.UnmanagedType.I4)]
    int crop[4];
    };
    

    希望有帮助, 顺致敬意, 汤姆。