Функция C # не обновляет SAFEARRAY

У меня есть функция C # со следующей подписью:

int Get1251Bytes(string source, byte[] result, Int32 lengthOfResult)

Я называю это из C ++. Компилятор сообщил мне, что второй параметр должен иметь SAFEARRAY* тип. Я называю это так:

SAFEARRAY* safeArray = SafeArrayCreateVector(VT_UI1, 0, arrayLength);
char str[] = {'s', 't', 'a', 'c', 'k', '\0'};
converter->Get1251Bytes(str, safeArray, arrayLength);

Но safeArray не обновляется, он все еще содержит нули. Но я проверял Get1251Bytes функция в модульном тесте C #. Работает нормально и обновляется result массив. Что я делаю неправильно?

5

Решение

Ваша проблема связана с Blittable и Non-Blittable Типы (Byte является легкомысленным):

В качестве оптимизации массивы blittable типов и классов, которые содержат только blittable члены, прикрепляются, а не копируются во время маршалинга. Эти типы могут отображаться как параметры входа / выхода, когда вызывающий и вызываемый абоненты находятся в одной квартире. Однако эти типы фактически маршалируются как параметры In, и вы должны применить атрибуты InAttribute и OutAttribute, если вы хотите маршалировать аргумент как параметр In / Out.

Чтобы исправить свой код, вам нужно применить [Out] приписать result параметр в коде C #:

int Get1251Bytes(string source, [Out] byte[] result, Int32 lengthOfResult)

Кроме того, вам не нужно проходить lengthOfResult, В .NET вы можете использовать Length свойство, чтобы получить размер массива.

3

Другие решения

Даже с Array’s вы должны использовать ref или же out, И вы должны использовать out,

int Get1251Bytes(string source, out byte[] result, Int32 lengthOfResult)
{
...
}

Для получения дополнительной информации о из а также ссылка локк по ссылкам.

А вот статья о массивы

-1

По вопросам рекламы [email protected]