У меня есть функция 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
массив. Что я делаю неправильно?
Ваша проблема связана с 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
свойство, чтобы получить размер массива.