Как передать массив объектов в неуправляемый код? - PullRequest
2 голосов
/ 09 июля 2010

Я пытаюсь передать массив объектов из C # в неуправляемый C ++, и, похоже, ничего не работает.

Компилятор не позволит мне сделать вид, что массив - это IntPtr. Преобразование массива в IntPtr не работает. Я пытался передать адрес закрепленных данных, но это тоже не сработало.

Мне просто нужно передать указатель на начало массива, и это оказывается невероятно трудным.

Есть предложения или ссылки? Thanx!

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Что в итоге сработало:

  1. Передача массива структур вместо массива объектов (ссылок).
  2. Помещение "[StructLayout (LayoutKind.Sequential, Pack = 1)]" непосредственно перед определением структуры.
  3. Помещение «[MarshalAs (UnmanagedType.LPWStr)]» перед строкой (в определении структуры), чтобы строка отображалась как строка широких символов на стороне C ++.
  4. Объявление массива структур для аргумента в объявлении DllImport: «VariableObject [] varObj».
  5. Объявление указателя на класс в качестве параметра на стороне C ++. (Класс C ++ отражает структуру C #.): "VariableObject * varObj".
1 голос
/ 09 июля 2010

Можете ли вы привести к пустому указателю?Убедитесь, что массив объектов закреплен.

0 голосов
/ 02 февраля 2012

В вашей подписи C # / управляемого метода пометьте входной параметр с помощью [MarshalAs (UnmanagedType.LPArray, SizeParamIndex = 0)] ...

[DllImport(...)]
public void DoTask
    (
        ...,
        [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] results,
        ...
    );

Затем вызовите его какты сделал всегда.Кроме того, внутри неуправляемого кода вы можете изменить этот массив.Я предлагаю вам отправить дополнительный int, сообщающий неуправляемому коду, каков размер массива, чтобы предотвратить изменение «массива вне границы».

...