2012-02-18 73 views
2
[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類型。 如果有人可以驗證,我會愛。如何將C#結構轉換爲C結構?

+0

你的問題是什麼? – 2012-02-18 22:11:16

+0

您是否從C定位Windows? – 2012-02-18 22:11:50

+0

我以Windows爲目標 – 2012-02-18 22:14:25

回答

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; 
} 

基本改變

  • 不要在StructLayout指定SizeConst除非你正在試圖創造更大的一個結構,其大小是不同的(典型值)比它的內容。這不是很常見的做的不是通常所需要的基本類型
  • 使用IntPtrUIntPtr到PInvoke的指針類型此
  • MarshalAs。它們在32和64位平臺之間大小不同
+0

非常感謝。正是我在找什麼。 – 2012-02-18 22:26:13