如何将C#struct转换为C struct?

时间:2012-02-18 22:08:33

标签: c# c struct marshalling

[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#struct。每个字段上方的注释在C中键入。 如果有人可以验证,我很乐意。

1 个答案:

答案 0 :(得分:6)

听起来您正在尝试获取成员内容中定义的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;
}

基本变化

  • 除非您尝试创建大小不同(通常)大于其内容的结构,否则请勿在{{1​​}}中指定SizeConst。这样做并不常见
  • 原始类型通常不需要
  • StructLayout
  • 使用MarshalAsIntPtr来指示PInvoke指针类型。它们在32位和64位平台之间的大小变化很小