2009-12-06 2 views
0

Je travaille avec des paquets que je peux recevoir ou envoyer en tant que tableau d'octets, qui a une structure fixe. Donc, je suis en train de créer une union efficace comme suit:Unions de structures de taille fixe à utiliser dans un contexte sûr

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

J'obtiens une erreur C#

Pointeurs et des tampons de taille ne peuvent être utilisés dans un contexte dangereux

Que dois-je faire pour être capable de créer et d'utiliser des structures «dangereuses» dans un environnement sûr? Merci pour votre aide - ouvert à toutes les suggestions sur la façon de gérer les structures de paquets qui peuvent facilement être converties vers et à partir d'un flux d'octets fixe reçu par (ou envoyé par) une classe d'interopérabilité C++.

Répondre

0

Utilisez le mot-clé dangereux sur la méthode ou le bloc:

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

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

Vous devez également activer le code dangereux via l'option/ou dangereux du projet> Propriétés> onglet Créer dans Visual Studio.

3

L'utilisation du mot-clé fixed nécessite Pkt et toutes les méthodes qui l'utilisent pour être déclaré dangereux, par exemple,

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

    ... 
} 

Si vous ne souhaitez pas utiliser du code non sécurisé, vous pouvez déclarer Pkt comme suit:

[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; 
} 
Questions connexes