views:

637

answers:

2

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?

A: 

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.

Jonathan.Peppers
Sysarray does not, unfortunately, provide a fix.
Aidan Ryan
+1  A: 

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...

Jonathan.Peppers
IMachine is not an IDispatch. I am going to give it a go from C++ starting with the IDL.
Aidan Ryan