c # — Маршалинг SAFEARRAY управляемых структур с помощью COM Interop

Я пытаюсь передать массив структуры, экспортируемой из библиотеки C # в код C ++. цель — передать SAFEARRAY структуры из c ++ в c #.

Я следовал инструкциям

http://limbioliong.wordpress.com/2011/07/16/marshaling-a-safearray-of-managed-structures-by-com-interop-part-2/

но получая эту ошибку с помощью вызова GetRecordInfoFromTypeInfo

0x80028019 Старый формат или недопустимая библиотека типов.

0

Решение

Если вам не нужно иметь интерфейс, должно работать следующее:

void MyMethod([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] MyStruct[] data, long size);

Если вам нужно использовать SAFEARRAY, я ожидаю, что следующие будут работать (но я не уверен на 100%, так как у меня нет машины с Windows на данный момент):

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] MyStruct[] data);

Если вы можете позволить себе изменить свой struct в class тогда это также сработает и избавит вас от хлопот UDT:

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)] MyStruct[] data);
1

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

Содержит ли структура строки? Если это так, не забудьте пометить их [MarshalAs (UnmanagedType.BStr)]. В COM есть ограничение: строки в массивах структур должны быть BSTR. По умолчанию TLBExp — LPWSTR, и затем вызов умирает. Посмотреть здесь: http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.100).aspx

1

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