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?

Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top