Я также использовал VT_RECORD.
Но не удалось успешно пройти безопасную проверку UDT.
[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
);
Если я связываюсь со своим неуправляемым кодом без 1-го параметра, то при передаче параметра "guids" в неуправляемый код не возникает ошибка.
Я также могу привести элементы полученного SAFEARRAY на неуправляемой стороне к типу GUID.
Но если я попытался передать свой класс UDT MY_CLASS неуправляемому коду с помощью SAFEARRAY, то это не сработало в управляемом коде. (как указано выше фрагмент кода)
Это показывает исключение «Необработанное исключение типа« System.Runtime.InteropServices.SafeArrayTypeMismatchException »произошло в myapp.exe»
«Дополнительная информация: указанный массив не соответствует ожидаемому типу.»
Пожалуйста, помогите мне в такой ситуации передать SAFEARRAY UDT в неповрежденный код.