Marshal類
Marshal類支持從託管內存空間複製數據到非託管內存空間,或是從非託管內存空間到託管內存空間。如果你研究在線的MSDN文檔庫,你會看到在桌面.NET框架下這個類支持的分配非託管內存空間的方法和其他的一些與COM對象共同工作的方法。沒有任何內存空間管理和COM支持方法在.NET精簡框架的Marshal實現中出現。表4.5總結了Marshal類的被.NET精簡框架支持的成員:13方法名(有一個或多個重載版本)和1個只讀域。
表4.5 Marshal類中.NET精簡框架支持的成員
Marshal 成員 |
描述 |
在託管和非託管間複製 |
|
Copy |
在託管和非託管內存空間之間複製值類型數組。支持CLI整型,包括64位整型。支持單精度和雙精度浮點數。有14個重載的方法(7個用來複制到託管內存空間;7個用來複制到非託管內存空間) |
複製到非託管內存空間 |
|
StructureToPtr |
複製託管對象到非託管內存空間 |
WriteByte |
寫入一個字節(byte)到非託管內存空間 |
WriteInt16 |
寫入兩個字節到非託管內存空間 |
WriteInt32 |
寫入4個字節到非託管內存空間 |
複製到託管內存空間 |
|
PtrToStringUni |
在非託管內存空間中創建一個託管的字符串 |
PtrToStructure |
在非託管內存空間中創建一個對象 |
ReadByte |
從非託管內存空間中讀取一個字節 |
ReadInt16 |
從非託管內存空間中讀取兩個字節 |
ReadInt32 |
從非託管內存空間中讀取四個字節 |
信息的 |
|
IsComObject |
如果是硬編碼返回False |
SizeOf |
查詢一個對象實體的非託管大小。用來設置一些Win32函數調用的結構體大小的域值。 |
GetLastWin32Error |
調用GetLastError函數來取回Win32錯誤碼 |
SystemDefaultCharSize |
在默認的字符集中,字符大小的只讀的域。(在.NET精簡框架中返回2。)爲了可移植性。 |
Marshal類的一些方法允許改寫非託管的緩存,於是你就能夠將它們作爲參數傳遞到非託管函數中。這個類的另外一些方法可以讓你從非託管緩存中讀取值並寫入托管數據對象中。從緩存中改寫和讀取都是重要的,因爲Win32 API(連同許多其它的基於C的API)爲從一個調用者到一個被調函數的通信提供了使用緩存的擴展。
這個表不包括許多用來分配非託管內存的函數。下面的內存分配函數在MSDN庫中有所說明,並且內建在桌面.NET框架中,但是他們不被.NET精簡框架所支持。
ü AllocHGlobal
ü FreeHGlobal
ü AllocCoTaskMem
ü FreeCoTaskMem
在你從託管內存中讀取或寫入之前,你需要獲得一些非託管內存空間。在深入到Marshal類的內存複製方法中之前,我們需要看一看一個.NET精簡框架程序員如何處理內存分配。