C # Marshal uint * & параметр - PullRequest
       23

C # Marshal uint * & параметр

3 голосов
/ 03 ноября 2011

Я просматриваю весь форум stackoverflow, но я совершенно не уверен, подходит ли мое решение по сортировке моей проблеме.

Я получил метод c ++, возвращающий массив целых чисел через параметр. Прототип является следующим:

method1(uint aId, uint*& aNewIntArray, uint& aNewIntArrayCount);

Я маршал параметры как:

method1(UInt32 aId, ref UIntPtr aNewIntArray, ref UInt64 aNewIntArrayCount);

Я маршал UINT * и реферирую UIntPtr, но я не совсем уверен, что это правильно, и, хотя я не нашел другого, с такой же проблемой, я спрошу у себя.

Еще одна идея: возможно ли маршалировать int * и int & параметр одним и тем же способом, используя

ref UInt32

? Или мне нужно было использовать UIntPtr / IntPtr без ключевого слова "ref"? В этом случае я бы предпочел использовать ref вместо out , чтобы C ++ не использовал неинициализированную ссылку на int.

1 Ответ

2 голосов
/ 03 ноября 2011

Ваш метод C ++ выделяет массив целых чисел и возвращает указатель на первый элемент в aNewIntArray. Поэтому определение соответствия C # для этого параметра равно

ref IntPtr aNewIntArray

Вы использовали UIntPtr, что в основном эквивалентно. Я думаю, что у вас сложилось впечатление, что UIntPtr - это то, что вы используете, если базовый массив не подписан, но это не так. Это фактически указатель void*, и вам придется использовать Marshal.Copy для переноса в массив C #, uint[].

Обратите внимание, что, поскольку aNewIntArray действительно является параметром out, я думаю, вы должны объявить его как таковой

Вы также объявили последний параметр неправильно. Это 32-разрядное целое число.

Поэтому я бы объявил функцию C # следующим образом:

method1(uint aId, out IntPtr aNewIntArray, out uint aNewIntArrayCount);
...