马歇尔一系列结构

时间:2010-10-28 15:22:40

标签: c# arrays marshalling

我从C#调用C ++函数。作为参数,它接收一个指向结构数组的指针。

struct A 
{
    int data;
}

int CFunction (A* pointerToFirstElementOfArray, int NumberOfArrayElements)

在C#中,我创建了相同的结构(作为类),并且我正确地编组它(正确接收数组中的第一个元素)。这是我对C ++结构的C#定义:

[StructLayout(LayoutKind.Sequential), Serializable]
class A
{
    int data;
}

第一个元素被正确读取,所以我知道结构中的所有字段都被正确编组。当我尝试发送元素数组时会发生此问题。 如何创建将在单个内存块(块)中的类数组,因此C ++函数可以将指针递增到数组?

我想我需要类似于stackalloc的东西,但是我相信它只适用于原始类型?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这不是一个明确的答案,但仅仅是一个例子,您可以使用stackalloc和不安全的代码来完成此任务。

public unsafe class Example
{
  [DllImport("library.dll")]
  private static extern int CFunction(A* pointerToFirstElementOfArray, int NumberOfArrayElements); 

  public void DoSomething()
  {
    A* a = stackalloc A[LENGTH];
    CFunction(a, LENGTH);
  }
}

另外,请注意API接受的结构的打包。您可能必须使用Pack属性的StructLayout属性。我相信默认值是4,但有些API需要1。

修改

为此,您必须将A的声明从类更改为结构。

public struct A
{
  public int data;
}