12/12/09 12:00
xeeynamo
Si lo sò, ho rotto un pochetto le scatole con le strutture e con tutte queste operazioni a basso livello col C# XD ma per il lavoro che stò facendo purtroppo mi è obbligatorio usare questi sistemi e il linguaggio più semplice e flessibile per me è il C#.
Passando al problema... Ho una classe/struttura fatta in questo modo:
ed eseguendo la funzione
mi restituisce il valore 11 e sin qui è perfetto perchè posso ordinare classi e strutture come voglio io. Ora voglio metterci all'interno ad esempio un array:
ora il valore restituito dovrebb'essere 17, ma mi restituisce 14. Quando vado a copiare dei dati usando le funzioni Marshal nella classe il programma mi restiuisce questa eccezione: AccessViolationException. Ovviamente se tolgo quell'array il programma va liscio come l'olio. Credo che quei 4 bytes che mi genera l'array non sono altro che un puntatore verso una parte di memoria dinamica e quindi non corrispondono al vero array o mi sbaglio? Quindi quando vado a copiare i dati non faccio altro che sostituire il puntatore con dati che non c'entrano niente causando quel tipo di eccezione vero?
Comunque la funzione che uso è questa:
Come potrei risolvere?
Passando al problema... Ho una classe/struttura fatta in questo modo:
[StructLayout(LayoutKind.Sequential, Pack = 1)] public class Test { uint var1; byte var2; ushort var3; uint var4; }
ed eseguendo la funzione
Test test; System.Runtime.InteropServices.Marshal.SizeOf(test);
mi restituisce il valore 11 e sin qui è perfetto perchè posso ordinare classi e strutture come voglio io. Ora voglio metterci all'interno ad esempio un array:
public class Test { uint var1; byte var2; ushort var3; uint var4; byte[] var5 = new byte[6]; }
ora il valore restituito dovrebb'essere 17, ma mi restituisce 14. Quando vado a copiare dei dati usando le funzioni Marshal nella classe il programma mi restiuisce questa eccezione: AccessViolationException. Ovviamente se tolgo quell'array il programma va liscio come l'olio. Credo che quei 4 bytes che mi genera l'array non sono altro che un puntatore verso una parte di memoria dinamica e quindi non corrispondono al vero array o mi sbaglio? Quindi quando vado a copiare i dati non faccio altro che sostituire il puntatore con dati che non c'entrano niente causando quel tipo di eccezione vero?
Comunque la funzione che uso è questa:
public static object Byte2Struct(byte[] buf, object o) { IntPtr ptPoit = Marshal.AllocHGlobal(buf.Length); Marshal.Copy(buf, 0, ptPoit, buf.Length); o = Marshal.PtrToStructure(ptPoit, o.GetType()); Marshal.FreeHGlobal(ptPoit); return o; }
Come potrei risolvere?
Ultima modifica effettuata da xeeynamo 12/12/09 12:01
aaa