c#创建非托管对象*数组

时间:2017-12-01 13:05:05

标签: c# arrays object unmanaged

我需要创建一个非托管对象的可变长度数组,但是我也需要这个数组也是非托管的,所以我不能使用List<>或其他类,但我必须以c方式malloc / realloc。

这是我的代码:

unsafe class A{
    unsafe private int a1, a2;
    unsafe public byte* arr;
}

并且在不同的类方法上我想做这样的事情:

private unsafe A* arr = Marshal.AllocHGlobal(array_size * Marshal.SizeOf<A>());

现在我提出这些问题:

  1. 如何将IntPtr转换为A *? OR 确实存在正确的c#malloc / realloc 功能? OR 如果我.dll导入真正的c / c ++ realloc函数会 安全使用吗?
  2. 如何获得指向A非托管对象的A *指针?如果我尝试'&amp;'它说“不能接受[...]托管对象的地址”,但它不应该被管理。我是否在课堂申报中做错了什么?
  3. 可选:为什么sizeof(A)不起作用,但Marshal.SizeOf()没关系?

1 个答案:

答案 0 :(得分:2)

你不能使用C#类来做这些事情,但你可以使用struct:

[StructLayout(LayoutKind.Sequential)]
struct A
{
    public int A1;
    public int A2;
}

int array_size = 5;
// just cast IntPtr to A*
A* arr = (A*) Marshal.AllocHGlobal(array_size * Marshal.SizeOf<A>());
// set first element of unmanaged array
arr[0] = new A {A1 = 1, A2 = 2};
// set second
arr[1] = new A {A1 = 3, A2 = 4};

// alternative syntax:
// set first element
*arr = new A { A1 = 5, A2 = 6 };
// set second element
*(arr + 1) = new A { A1 = 5, A2 = 6 };
// get first element
var first = *arr;
var second = *(arr + 1);
Console.WriteLine(first.A1 + " " + first.A2);
Marshal.FreeHGlobal((IntPtr)arr);