封送處理概觀
更新:2007 年 11 月
.NET Compact Framework 2.0 版會透過 IDispatch 和平台叫用 (Invoke) 與 vtable 呼叫,提供擴充的封送處理 (Marshaling) 支援。這項支援包括下列項目:
使用 MarshalAsAttribute 屬性。
Windows Embedded CE 上支援的封送處理變數型別。
封送處理透過 vtable 呼叫 COM 介面的型別。
封送處理具有內嵌陣列和字串的結構。
指定結構的配置。
您可以用傳值方式或傳址 (By Reference) 方式封送處理下列型別:
BStr
IUnknown
IDispatch
SafeArray
DateTime (封送處理成 OLE DATE)
Variant
請注意,.NET Compact Framework 2.0 支援 AllocHGlobal 和 FreeHGlobal 方法。
Interop 記錄
您可以建立函式簽章的記錄檔,以便查看如何封送處理 Interop 呼叫。如需如何建立檔案的詳細資訊,請參閱 HOW TO:建立記錄檔。如需如何解譯記錄檔的詳細資訊,請參閱記錄檔資訊。
與完整 .NET Framework 的封送處理差異
.NET Compact Framework 並不支援完整 .NET Framework 中提供的下列封送處理和互通性 (Interoperability) 功能:
自訂封送處理。
使用 GetDelegateForFunctionPointer 方法,從原生函式指標取得 Managed 委派。不過,您可以從 Managed 委派建立原生函式指標。
從原生元件存取 .NET Compact Framework 類別。
透過 IDispatch 傳遞結構 (VT_RECORD)。
透過 IDispatch 傳遞 Int64 和 UInt64 型別。
.NET Compact Framework 的下列封送處理行為與完整的 .NET Framework 不同:
.NET Compact Framework 允許封送處理 SCODE 值的陣列,完整 .NET Framework 則不允許。
.NET Compact Framework 封送處理 IUnknown 和 IDispatch 指標陣列的方式與完整 .NET Framework 不同。
.NET Compact Framework 會將所有執行緒初始化成多執行緒 Apartment,而且不支援其他執行緒模型或設定 Apartment Model。因此,.NET Compact Framework 不支援 ApartmentState 屬性或下列方法:
使用 Visual Basic Declare 陳述式封送處理
Visual Basic Declare 陳述式是 DLL 中,外部程序之 declare 參考的替代方法。請注意,不支援 Declare 陳述式中的 Ansi 關鍵字。
除了 ByVal String 物件之外,使用 Declare 陳述式的封送處理與使用 DllImportAttribute 類別的封送處理相同。在 Declare 陳述式中,ByVal String 參數將會封送處理為輸出參數。由於參數是永遠不變的,因此這個動作會強制 Common Language Runtime 複製字串然後傳回新的參考。
IDispatch 和平台叫用封送處理器之間的差異
下表將列出兩種封送處理器會以不同方式封送處理的型別。
型別 |
IDispatch |
平台叫用和 vtable |
---|---|---|
BStr |
wchar * |
|
Variant |
NULL |
|
VARIANT_BOOL |
Byte |
|
SafeArray |
C-Style Array |
.NET Compact Framework 會透過平台叫用 (而非 StructLayoutAttribute) 將類別封送處理成自動配置結構,而完整 .NET Framework 則會將它封送處理成 COM 可呼叫包裝函式 (CCW)。
請注意,.NET Compact Framework 會使用 FADF_FIXEDSIZE 來標記 SafeArray,而且如果您在機器碼中重新調整其大小,就會擲回例外狀況。
在 Boolean 轉譯成原生位元組型別的情況下,您無法將 Boolean 封送處理為傳回型別,而只能將它封送處理為引數。
封送處理委派
根據預設,委派會封送處理成函式指標。此外,您也可以明確使用 UnmanagedType 列舉型別中的 FunctionPtr 值,建立 MarshalAsAttribute 的執行個體。如需範例,請參閱將委派封送處理為函式指標。
指定字元集
當您透過平台叫用封送處理字串時,可以使用 DllImportAttribute 的 CharSet 欄位來指定字元集。
.NET Compact Framework 支援下列兩個值:
Ansi 值不受支援,因為 Windows Embedded CE 僅支援 Unicode。None 相當於 Ansi 且不受支援。
因為 .NET Compact Framework 不支援 ExactSpelling 欄位,Common Language Runtime 會根據 CharSet 所指定的值自動搜尋進入點。
Pin 物件
當 .NET Compact Framework Common Language Runtime 封送處理物件時,該物件會在平台叫用呼叫持續時間時被 Pin 住,以確保記憶體回收行程不會釋放或移動物件。
記憶體使用方式
使用下列方針,在 .NET Compact Framework 中以 Unmanaged 程式碼處理記憶體:
永遠在 Managed 程式碼中配置記憶體,並將它傳遞至 Unmanaged 程式碼。
如果 Unmanaged 程式碼含有指向 Managed 元件的指標,您就必須使用 GCHandle 結構手動 Pin 住該物件。
.NET Compact Framework Common Language Runtime 會在啟動時共同初始化 (Coinitialize) 執行緒,並在關機時將其共同還原初始化 (Couninitialize)。執行緒會標記為「無限制執行緒」(Free Threading)。