VirtualBox COM API с C#
-
13-09-2019 - |
Вопрос
Я пытаюсь использовать 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 , этот маршалирует массивы по-другому и может решить вашу проблему.