2010-02-26 8 views
0

J'ai un projet dans lequel j'utilise System.Runtime.InteropServices pour définir une structure de la manière suivante de telle sorte qu'elle soit empaquetée aux limites de byte et prête à être envoyée à un port série et de là à un système embarqué. (Noms commerciaux sensibles ont été supprimés)Comment manipuler des données dans des structures compressées en utilisant une classe proxy?

public class ControlCommandClass 
{ 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] 
    public struct ControlCommandData 
    { 
    public Uint32 Field1; 
    public Uint16 Field2; 
    public Sbyte Field3; 
    public Uint32 Field4; 
    }; // this struct is 11 bytes in memory! 

    private ControlCommandData rawdata; 

    public UTCTime Field1; 

    public ControlCommandClass() 
    { 
    this.Field1 = new UTCTime(ref this.rawdata.Field1); 
    } 
} 

Ce que je suis en train de faire est de faire est d'utiliser le constructeur d'attribuer des références à ces champs à une classe proxy à l'aide

Field1 = new UTCTime(ref this.rawdata.Field1) 

pour envelopper le données brutes dans la structure à une classe qui permet des opérations plus avancées avant de calculer l'entier de 32 bits qui correspond à l'heure. ma classe proxy est

public class UTCTime : Field 
{ 
    private Uint32 dataReference; 

    public UTCTime(ref rawData) 
    { 
    // code to do reference assignment here? 
    } 
} 

Est-il possible d'avoir DataReference comme une référence à Champ1 telle que ma classe proxy est capable de manipuler les données dans la structure emballée? Merci d'avance, Thomas.

Répondre

1

Ce n'est pas possible en l'état.

La règle générale est que vous ne pouvez pas stocker une référence à un objet géré.

En passant par référence vous permet de utiliser une référence autant que vous le souhaitez. Mais vous devrez passer à un bloc non sécurisé avec IntPtr pour accomplir ce que vous essayez de faire.