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?
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…