VT_RECORD も使用しました。しかし、UDT の safearray を渡すことに成功しませんでした。
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public class MY_CLASS
{
[MarshalAs(UnmanagedType.U4)]
public Int32 width;
[MarshalAs(UnmanagedType.U4)]
public Int32 height;
};
[DllImport("mydll.dll")]
public static extern Int32 GetTypes(
[In, Out][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_RECORD, SafeArrayUserDefinedSubType = typeof(MY_CLASS))]MY_CLASS[] myClass,
[In, Out][MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_RECORD, SafeArrayUserDefinedSubType = typeof(Guid))]Guid[] guids
);
最初のパラメーターを使用せずにアンマネージ コードと通信すると、「guids」パラメーターをアンマネージ コードに渡してもエラーは発生しません。
アンマネージ側で取得した SAFEARRAY の要素を GUID 型にキャストすることもできました。しかし、UDT クラス MY_CLASS を SAFEARRAY を使用してアンマネージ コードに渡そうとすると、マネージ コードで失敗します。(上記のコード スニペットのように)
「タイプ 'System.Runtime.InteropServices.SafeArrayTypeMismatchException' の未処理の例外が myapp.exe で発生しました」「追加情報: 指定された配列は予期されたタイプではありませんでした」という例外が表示されます。
このような状況で UDT の SAFEARRAY を unmaged コードに渡すのを手伝ってください。