Kan noen forklare Marshal.StructureToPtr

stemmer
3

Jeg har noen problemer med denne koden:

//Creating a new ImageElement Struct
ImageElement oElement = new UM0516.ImageElement();
//Create a pointer and allocate enough room for the struct type
IntPtr pElement = Marshal.AllocHGlobal(Marshal.SizeOf(new UM0516.ImageElement()));
//Copy the contents of the struct into the allocated memory space
Marshal.StructureToPtr(oElement, pElement, true);
//Function that takes a file pointed to by handle, and does some sweet sweet things
//And returns a loaded struct pointed to by pElement
FILES_GetImageElement(handle, el, out pElement);

Her er der jeg blir forvirret: Jeg skal gå gjennom koden, og etter at jeg kaller det siste funksjonen (som skal endre noen biter i minnet peker til pElement), ser jeg en endring i oElement !? Jeg trodde Marshal.StructureToPtr kopier data fra en administrert struct til minnet. Så er de to stedene faktisk det samme? Managed struct oElement og allokert minne peker til pElement?

Publisert på 09/04/2009 klokken 21:15
kilden bruker
På andre språk...                            


2 svar

stemmer
3

Denne artikkelen forklarer det i detalj :

Formatert blittable klassene har faste oppsett (formatert) og felles data representasjon i både forvaltes og uovervåkede minne. Når denne type krever marshaling, blir en peker til objektet i haugen føres til den anropte direkte. Callee kan endre innholdet på minneplassen blir referert av pekeren.

Svarte 09/04/2009 kl. 21:32
kilden bruker

stemmer
0

Jeg tror du sannsynligvis ikke trenger å skaffe til veie strukturen manuelt til en peker. Så lenge klarte versjon av strukturen samsvarer med utformingen av uovervåkede struct deretter la Interop marshaler ta vare på marshaling.

Du bør være i stand til å kvitte seg med pElement helt og passere oElement som enten en ref parameter (hvis du bryr deg om hva som er i det på den måten) eller en ut parameter.

Svarte 09/04/2009 kl. 21:30
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more