Как преобразовать структуру C # в структуру C? - PullRequest
2 голосов
/ 19 февраля 2012
[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 Ответ

6 голосов
/ 19 февраля 2012

Похоже, вы пытаетесь получить структуру 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 для типов указателей PInvoke. Они варьируются по размеру между 32 и 64-битными платформами
...