Маршаллинг массива шорт: произошло несоответствие

У меня есть следующая структура С++:

    typedef struct FormulaSyntax{
        WORD StructSize;
        short formulaSyntax [2];
    } FormulaSyntax;

У меня есть метод DLL, который принимает экземпляр этой структуры. Вот что я пробовал на стороне С#:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct FormulaSyntax {
        public short StructSize;
        public short[] formulaSyntax;
    }

    [DllImport(DLL_NAME, EntryPoint = "PEGetFormulaSyntax",
                    CharSet = CharSet.Unicode)]
    public static extern bool getFormulaSyntax(short reportID,
                     ref FormulaSyntax syntax);

    ...
    FormulaSyntax syntax = new FormulaSyntax();
    syntax.formulaSyntax = new short[2];
    syntax.StructSize = (short)Marshal.SizeOf(syntax);
    PrintEngine.getFormulaSyntax(context.oldApiID, ref syntax);

Это падает, давая мне сообщение

Mismatch has occurred between the runtime type of the array and the sub type recorded in the metadata.

Что я делаю не так?


person Epaga    schedule 19.05.2010    source источник


Ответы (1)


Ответ найден здесь: вот как должна выглядеть моя структура C#: ему нужна строка MarshalAs. Теперь это работает.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct FormulaSyntax {
        public short StructSize;
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I4,
                                            SizeConst = 2)]
        public short[] formulaSyntax;
    }
person Epaga    schedule 19.05.2010