2017-05-17 1 views
0

Ce sont mes structurestype ne pouvait être marshalé parce que la longueur d'une instance de tableau intégré ne correspond pas à la longueur déclarée dans la mise en page

[StructLayout(LayoutKind.Sequential)] 
public struct DeptDetails 
{ 
    [MarshalAs(UnmanagedType.I4)] 
    public int depid; 
    [MarshalAs(UnmanagedType.I2)] 
    public short noemp; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] 
    public empDetails[] emp; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] 
    public string deptname; 
} 

[StructLayout(LayoutKind.Sequential)] 
public struct empDetails 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string empname; 
    [MarshalAs(UnmanagedType.I4)] 
    public int empid; 
} 

Je te l'envoie par des prises

structures.DeptDetails Details = new structures.DeptDetails(); 
Details.depid = 123; 
Details.noemp= 3; 
Details.emp= new structures.empDetails[Details.noemp]; 

Details.emp[0].empname= "xyz"; 
Details.emp[0].empid= 1; 

Details.scrips[1].empname="abc" 
Details.scrips[1].empid = 2; 

Details.scrips[2].empname= "pqr" 
Details.scrips[2].empid= 6; 

Details.deptname= "PYTHON"; 
int bytesSend = senderSock.Send(MainModule.struc.StructureToByteArray(Details)); 

StructureToByteArray Méthode contient:

public byte[] StructureToByteArray(object obj) 
{ 
    int len = Marshal.SizeOf(obj); 
    byte[] arr = new byte[len]; 
    IntPtr ptr = Marshal.AllocHGlobal(len); 
    Marshal.StructureToPtr(obj, ptr, true); 
    Marshal.Copy(ptr, arr, 0, len); 
    Marshal.FreeHGlobal(ptr); 
    return arr; 
} 

Mais je ne peux pas envoyer des données ... mon exception est:

Le type n'a pas pu être marshalé car la longueur d'une instance de groupe incorporé ne correspond pas à la longueur déclarée dans la mise en page.

+1

http://stackoverflow.com/questions/8845514/error-type-could-not-be-marshaled-because-the-length-of-an-embedded-array-inst? – CodeCaster

+0

je suis passé par ce lien, mais ne peut pas le relier comment résoudre mon problème – pallavi

Répondre

0

L'exception est très claire:

... la longueur d'un tableau intégré instance ne correspond pas à la longueur déclarée dans la mise en page

Par conséquent, vous 'ai instancié un tableau avec une taille différente de celle déclarée (déclaré 8, instancié 3), donc il ne peut pas être marshalé.

+0

Merci beaucoup ... Votre réponse m'a aidé – pallavi