有人可以解释Marshal.StructureToPtr

时间:2009-04-09 21:15:36

标签: memory struct pointers marshalling

我在使用此代码时遇到了一些问题:

//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将数据从托管结构“复制”到内存中。这两个地点实际上是一样的吗? pElement指向的托管struct oElement和已分配的内存?

2 个答案:

答案 0 :(得分:3)

本文在detail中解释了它:

  

格式化的blittable类有   固定布局(格式化)和常见   管理中的数据表示   和非托管的记忆。当这些类型   需要编组,指向   堆中的对象传递给   callee直接。被调用者可以改变   指针引用的内存位置的内容。

答案 1 :(得分:0)

我认为您可能不需要手动将结构封送到指针。只要结构的托管版本与非托管结构的布局匹配,就让interop marshaler负责编组。

你应该能够完全摆脱pElement并将oElement传递为ref参数(如果你关心路上的内容)或out参数。