Как преобразовать c# struct в C struct?


[StructLayout(LayoutKind.Sequential, Size = 280), Serializable]
public struct AESContext
{
    /// int nr; 
    [MarshalAsAttribute(UnmanagedType.I4, SizeConst = 4)]
    public int nr;

    /// unsigned long *rk;
    [MarshalAsAttribute(UnmanagedType.U4, SizeConst = 4)]
    public uint rk;

    // unsigned long buf[68];
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 68)]
    public uint[] buf;
}

Это структура C#, которая у меня есть до сих пор. Комментарий над каждым полем вводится в поле C. Я был бы рад, если бы кто-нибудь мог проверить.

1 2

1 ответ:

Похоже, что вы пытаетесь получить структуру C# для структуры C, определенной в содержимом элемента. Если это так, то я полагаю, что вы хотите следующее

[StructLayout(LayoutKind.Sequential), Serializable]
public struct AESContext
{
    /// int nr; 
    public int nr;

    /// unsigned long *rk;
    public UIntPtr rk;

    // unsigned long buf[68];
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 68)]
    public uint[] buf;
}

Основные изменения

  • не указывайте SizeConst в StructLayout, Если вы не пытаетесь создать структуру, размер которой отличается (как правило) больше, чем ее содержимое. Это не очень распространено, чтобы сделать это
  • MarshalAs обычно не требуется для примитивных типов
  • используйте IntPtr или UIntPtr для вызова типов указателей. Они различаются правильно по размеру между 32 и 64 битными платформами