2012-11-16 1 views
2

Je dois convertir un tableau d'octets en mon type de structure. Pour ce faire, j'utilise le code suivant pour l'application de projet de bureau:Conversion d'un tableau d'octets en structure dans le Compact Framework

var str = new SFHeader(); 
int size = Marshal.SizeOf(str); 

IntPtr ptr = Marshal.AllocHGlobal(size); 
Marshal.Copy(buffer, 0, ptr, size); 
str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 
Marshal.FreeHGlobal(ptr); 

return str; 

SFHeader est ma structure.

Le problème est que la ligne:

str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 

jette un NotSupportedException quand je lance ce code d'un projet de dispositif intelligent. Existe-t-il d'autres méthodes pour effectuer ce travail dans le Compact Framework?

[StructLayout(LayoutKind.Sequential)] 
public struct SFHeader 
{ 

    internal const int MAX_FILENAME_LENGTH = 32; 


    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)] 
    public string FileName; 

    public int Offset; 

    public short Size; 

    public byte Flags; 

    public byte Source; 

    public long LastWriteTime; 

} 

Répondre

2

Marshal.PtrToStructure fonctionne et je l'ai utilisé plusieurs fois dans le cadre compact. il semble que vous l'utilisiez correctement. Par conséquent, le problème doit être votre définition struct (quelque chose pourrait ne pas être pris en charge dans les FC pour le struct)

Le code suivant exécute très bien sur mon appareil à l'aide de Windows CE 5.0 et .NET CF 3,5

[StructLayout(LayoutKind.Sequential)] 
    public struct SFHeader 
    { 
     internal const int MAX_FILENAME_LENGTH = 32; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_FILENAME_LENGTH)] 
     public string FileName; 
     public int Offset; 
     public short Size; 
     public byte Flags; 
     public byte Source; 
     public long LastWriteTime; 
    } 

    private static void Test() 
    { 
     var str = new SFHeader(); 
     int size = Marshal.SizeOf(str); 
     byte[] buffer = new byte[size]; 

     IntPtr ptr = Marshal.AllocHGlobal(size); 
     Marshal.Copy(buffer, 0, ptr, size); 
     str = (SFHeader)Marshal.PtrToStructure(ptr, typeof(SFHeader)); 
     Marshal.FreeHGlobal(ptr); 
    } 

Je vérifie pour vous assurer que vous suivez ces directives Marshaling Structures in the .NET Compact Framework

Une autre option consiste à copier manuellement les champs de votre tampon dans votre structure octet par octet. Vous pouvez écrire une fonction qui retourne un SFHeader et prend un octet [].

+0

Voir modification s'il vous plaît. – Nick

+0

@Nick Hmm .. Avez-vous aussi la définition C de l'en-tête? – Alan

+0

oui, pourquoi? voulez-vous voir la définition C? – Nick

Questions connexes