2010-05-28 3 views
1

i ont une structure avec une longueur dynamique:C# marshaling chaîne de longueur dynamique

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    struct PktAck 
    { 
     public Int32 code; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string text; 
    } 

quand je suis convertir octets [] struct par ce code:

GCHandle handle = GCHandle.Alloc(bytes_array, GCHandleType.Pinned); 
result_struct = (PktAck)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PktAck)); 
handle.Free(); 

j'ai une erreur, parce que la taille de la structure est inférieure à la taille des octets [] et le "texte de la chaîne" est le pointeur sur la chaîne ...

Comment puis-je utiliser les chaînes dynamiques? ou je peux utiliser seulement quelque chose comme ceci:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)] 

màj: c struct

struct PktAck 
    { 
     int code; 
     char* text; 
    } 
+0

Veuillez nous montrer le C 'struct'. – SLaks

+0

Salut, J'ai le même problème. Avez-vous obtenu la solution? Merci, Ofir – Ofir

Répondre

0

Si vous êtes désireux de maréchal cette struct dans un appel PInvoke alors j'utiliser la classe Marshal à allouer la chaîne.

struct PktAck 
{ 
    public Int32 code; 
    public IntPtr text; 
} 

public static void Main() 
{ 
    var a = new PktAck(); 
    a.code = 314159; 
    a.text = Marshal.StringToHGlobalAnsi("foo"); 
    try 
    { 
    SomePInvokeCall(a); 
    } 
    finally 
    { 
    Marshal.FreeHGlobal(a.text); 
    } 
} 
+0

je veux convertir tableau d'octets à ce struct et struct à un tableau arrière. J'ai une fonction qui le fait, mais cette fonction ne fonctionne pas sur la structure dynamique. – mitsky

+0

Une fois que vous changez le code pour utiliser un 'IntPtr' au lieu de' string', il aura une taille fixe. L'appel 'Marshal.PtrToStructure' devrait fonctionner après cela. –

+0

Celui-ci devrait être marqué comme une réponse. Le PO devrait sinon fournir plus d'informations pour en élaborer un. –

Questions connexes