Может кто-то объяснить маршалу. StructureToPtr - PullRequest
3 голосов
/ 10 апреля 2009

У меня проблемы с этим кодом:

//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);

Вот где я запутался: я пошагово покажу код, и после того, как я вызову эту последнюю функцию (которая должна изменить некоторые биты в памяти, на которые указывает pElement), я вижу изменение oElement !? Я думал, что Marshal.StructureToPtr «копирует» данные из управляемой структуры в память. Так на самом ли деле два места одинаковы? Управляемая структура oElement и выделенная память, на которые указывает pElement?

Ответы [ 2 ]

3 голосов
/ 10 апреля 2009

Эта статья объясняет это подробно :

Форматированный blittable классы имеют фиксированный макет (отформатированный) и общий представление данных в обоих управляемых и неуправляемая память. Когда эти типы требуется маршалинг, указатель на объект в куче передается в вызываемый напрямую. Колли может измениться содержимое ячейки памяти, на которую ссылается указатель.

0 голосов
/ 10 апреля 2009

Я думаю, что вам, вероятно, не нужно вручную размещать структуру в указателе. Если управляемая версия структуры соответствует макету неуправляемой структуры, тогда маршалер взаимодействия может позаботиться о маршалинге.

Вы должны иметь возможность полностью избавиться от pElement и передать oElement в качестве параметра ref (если вам важно, что находится в пути) или параметра out.

...