Возврат массива двойного размера переменной из C ++ в C # - более простой способ? - PullRequest
2 голосов
/ 14 января 2009

У меня есть следующий метод C ++:

__ declspec (dllexport) void __stdcall getDoubles (int * count, double ** values); метод выделяет и заполняет массив double и устанавливает * count в размер массива.

Единственный способ заставить это работать через pinvoke:

[System.Runtime.InteropServices.DllImportAttribute("xx.dll")]
 public static extern void getDoubles(ref int count, ref System.IntPtr values);

и использование:

int count = 0;
IntPtr doubles = new IntPtr();
Nappy.getDoubles(ref count, ref doubles);
double[] dvs = new double[count];
for(int i = 0;i < count;++{
    dvs[i] = (double)Marshal.PtrToStructure(doubles, typeof(System.Double));
    doubles = new IntPtr(doubles.ToInt64()+Marshal.SizeOf(typeof(System.Double)));
}

значения попадают в массив dvs. Есть ли лучший способ сделать это, не используя арифметику указателей в управляемом языке ...

Ответы [ 2 ]

2 голосов
/ 14 января 2009

Я думаю, вы можете использовать

Marshal.Copy( source, destination, 0, size );
1 голос
/ 14 января 2009

Вам нужно изменить подпись неуправляемого метода, чтобы она выглядела следующим образом:

__declspec(dllexport) void __stdcall getDoubles(SAFEARRAY *array); 

Тогда вы сможете использовать следующую управляемую версию функции:

[System.Runtime.InteropServices.DllImportAttribute("xx.dll")]
public static extern void getDoubles(
              [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_R8)]
              double[] array
);

Конечно, вам также придется переписать свой неуправляемый код для работы с SAFEARRAY. Подробнее об этой теме можно найти на MSDN.

Хотя я вспоминаю один вопрос о работе с ZLib в C #, который способен без какой-либо оболочки работать с байтом [], в то время как неуправляемый аналог - BYTE *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...