2009-12-06 41 views
0

我正在處理可以接收或發送爲具有固定結構的Byte數組的數據包 。所以我想,如下所示創建一個有效的 工會:在安全環境中使用的固定大小結構的聯合體

using System; // etc.. 

namespace WindowsApplication1 
{ 
    public partial class Main : Form 
    { 
     public const int PktMaxSize = 124; 
     // ...etc.. 
     // ...will use Pkt structure below... 
    } 

    [System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] 
    public struct Pkt 
    { 
     [System.Runtime.InteropServices.FieldOffset(0)] 
     fixed Byte bytes[Main.PktMaxSize]; // complete byte pkt 

     [System.Runtime.InteropServices.FieldOffset(0)] 
     fixed Byte PktID[8]; 

     [System.Runtime.InteropServices.FieldOffset(8)] 
     UInt16 Properties; 

     // ...etc.. 
    } 
} 

我得到一個C#錯誤

指針和大小緩衝區只能在不安全的上下文中使用

我需要做什麼才能在安全的環境中創建和使用「不安全」結構?

感謝您的幫助 - 歡迎您提供關於如何處理可輕鬆轉換爲和接收(或發送)C++ interop類的固定字節流的數據包結構的建議。

回答

0

使用的方法或塊的不安全關鍵字:

unsafe static void DoSomethingUnsafe() 
{ 
    // use Pkt structure 
} 

static void DoSomething() 
{ 
    // do safe things 
    unsafe 
    { 
    // use Pkt structure 
    } 
} 

還必須啓用通過/不安全的選項或項目>屬性>生成在Visual Studio標籤不安全的代碼。

3

使用該fixed關鍵字的要求Pkt和使用它的所有方法被宣佈不安全的,例如,

[StructLayout(LayoutKind.Explicit)] 
public unsafe struct Pkt 
{ 
    [FieldOffset(0)] 
    fixed Byte bytes[124]; 

    ... 
} 

如果你不想使用不安全的代碼,你可以聲明Pkt如下:

[StructLayout(LayoutKind.Explicit)] 
public struct Pkt 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 124)] 
    [FieldOffset(0)] 
    Byte[] bytes; 

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    [FieldOffset(0)] 
    Byte[] PktID; 

    [FieldOffset(8)] 
    UInt16 Properties; 
}