2009-04-09 63 views
3

有人可以解釋我遇到一些麻煩,此代碼Marshal.StructureToPtr

//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和分配的內存?

+4

-1寫「幫助YO」和「庫爾耶」。 – 2009-04-09 21:19:10

回答

3

本文解釋它在detail

格式化blittable類具有 固定佈局(格式化)和共同 數據表示在兩個管理 和非託管內存。當這些類型的 需要編組,一個指針到堆中 對象被傳遞到被叫方 直接。被調用者可以更改指針所引用的內存位置的內容 。在同一職位

0

我想你也許並不需要結構手動元帥的指針。只要結構的託管版本與非託管結構的佈局相匹配,然後讓interop marshaler負責封送處理。

您應該能夠完全刪除P成分和通過oElement無論是作爲ref參數(如果你關心什麼在它的方式)或out參數。

+0

Afaik這需要不安全的指針和C#中的* fixed *語句(例如unsafe int *)以避免垃圾回收器不會移動內存(即memomry必須被固定)。 – 2009-04-09 21:36:53

+0

或者使用System.Runtime.InteropServices.GCHandle應該這樣做(如Marshal.StructureToPtr所述的文檔)。 – 2009-04-09 21:43:54