Выравнивание класса C # с классом C ++ с использованием отступов - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь выровнять класс C # с классом C ++, чтобы я мог RPM структуру в C #.Класс C ++ содержит пэд 0x10, но я не могу выровнять свой класс C # с моим классом C ++.

Класс C ++:

class Value
{
public:
    char pad_0x0000[0x10]; //0x0000
    float current; //0x0010 
    float maximum; //0x0014 
};

Мой класс C #:

class Value
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
    public byte[] pad_0x0000 = new byte[0x10]; //0x0000
    public float current; //0x0010 
    public float maximum; //0x0014 
};

Проблема в том, что всякий раз, когда я пытаюсь получить размер структуры с помощью Marshal.SizeOf, я получаю эту ошибку:

Значение не может быть маршалировано как неуправляемая структура;никакие значимые размеры или смещение не могут быть вычислены.

Я могу ошибаться.Все, что я пытаюсь сделать, это pad на 0x10, так что 2 класса выровнены

Заранее спасибо

РЕДАКТИРОВАТЬ: я последовал совету Ганса Пассанта и теперь он компилируется и работает правильно

[StructLayout(LayoutKind.Sequential)]
class Value
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
    public byte[] pad_0x0000 = new byte[0x10]; //0x0000
    public float current; //0x0010 
    public float maximum; //0x0014 
};

но значение тока по-прежнему неверно, что означает, что они не выровнены правильно.Поэтому мой вопрос сейчас таков: не является ли

char pad_0x0000[0x10]; //0x0000

того же размера, что и этот

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
public byte[] pad_0x0000 = new byte[0x10]; //0x0000

И если нет, то как мне получить эквивалент панели C ++ в c #

...