VirtualBox COM API from C#
-
13-09-2019 - |
Question
I am trying to use the VirtualBox COM API (VBoxC.dll) from C#. I ran
tlbimp VirtualBox.tlb
against the typelib included in the VirtualBox SDK. Referencing the output assembly builds OK but at runtime I get a SafeArrayTypeMispatchException
("Specificed array was not of the expected type") whenever I try to access properties that return arrays.
I can see, for example, that IVirtualBox.get_Machines()
is defined as
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_DISPATCH)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x60020009)]
public virtual extern IMachine[] get_Machines();
How can I get this call to marshall correctly?
Solution
Here is a link explaining your exception: MSDN reference
Your problem spot is most likely SafeArraySubType, is IMachine an IDispatch? There are more options in VarEnum for IUnknown, etc.
Unfortunately you will have to edit your COM library beyond what tlbimp spits out...
OTHER TIPS
There are a few command line options you can try with tlbimp.
Run tlbimp /? to see a few, one worth trying is /sysarray, this marshals arrays differently and may solve your issue.