Вопрос

Я пытаюсь использовать VirtualBox COM API (VBoxC.dll) из C #.Я побежал

tlbimp VirtualBox.tlb

против typelib, включенного в VirtualBox SDK.Ссылка на выходную сборку выполняется нормально, но во время выполнения я получаю SafeArrayTypeMispatchException ("Указанный массив не был ожидаемого типа") всякий раз, когда я пытаюсь получить доступ к свойствам, которые возвращают массивы.

Я могу видеть, например, что IVirtualBox.get_Machines() определяется как

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_DISPATCH)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x60020009)]
public virtual extern IMachine[] get_Machines();

Как я могу правильно передать этот звонок маршаллу?

Это было полезно?

Решение

Вот ссылка, объясняющая ваше исключение: Ссылка на MSDN

Ваше проблемное место, скорее всего, SafeArraySubType, является ли IMachine IDispatch?В VarEnum есть больше опций для IUnknown и т.д.

К сожалению, вам придется отредактировать свою COM-библиотеку сверх того, что выдает tlbimp...

Другие советы

Есть несколько параметров командной строки, которые вы можете попробовать с помощью tlbimp.

Запустить tlbimp /?чтобы увидеть некоторые из них, стоит попробовать / sysarray , этот маршалирует массивы по-другому и может решить вашу проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top