Маршалл массив структур - PullRequest
0 голосов
/ 28 октября 2010

Я вызываю функцию 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 голосов
/ 28 октября 2010

Это не является окончательным ответом, но просто пример того, как вы могли бы сделать это, используя 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.

Edit:

Чтобы это работало, вам нужно изменить объявление A с класса на структуру.

public struct A
{
  public int data;
}
...