Blittable 和非 Blittable 型別
大部分的資料型別在 Managed 和 Unmanaged 記憶體中都有共同的表示,而且不需要透過 Interop 封送處理器的特殊處理。這些型別稱為 Blittable 型別,因為在 Managed 和 Unmanaged 程式碼之間傳遞時,它們並不需要進行轉換。
以下出自於 System 命名空間的型別是 Blittable 型別:
以下的複雜型別也是 Blittable 型別:
Blittable 型別的一維陣列,例如整數陣列。然而,包含 Blittable 型別之可變陣列的型別本身,則不是 Blittable。
被封送處理為格式化型別,並只包含 Blittable 型別的格式化實值型別 (Value Type)。
物件參考不會是 Blittable。這些參考包括本身為 Blittable 之物件的參考陣列。例如,您可以定義本身為 Blittable 的結構,卻不能定義包含這些結構之參考陣列的 Blittable 型別。
因為最佳化,在封送處理時,只包含 Blittable 成員的 Blittable 型別和類別之陣列會被 Pin 而非複製。當呼叫端和被呼叫端是在相同的 Apartment 時,這些型別可以封送處理為 In/Out 參數。但是,這些型別實際會封送處理為 In 參數,而如果您要將引數封送處理為 In/Out 參數的話,必須套用 InAttribute 和 OutAttribute 屬性。
非 Blittable 型別在 Managed 和 Unmanaged 語言中有不同或模擬兩可的表示。當這些型別在 Managed 和 Unmanaged 程式碼之間封送處理時,可能需要轉換。例如,Managed 字串為非 Blittable 型別,因為它們可以有多個不同的 Unmanaged 表示,而其中某些可能需要轉換。
下表列出來自 System 命名空間的非 Blittable 型別。委派是一種參考靜態方法或類別執行個體的資料結構,也是非 Blittable。
非 Blittable 型別 | 說明 |
---|---|
轉換成 C-Style 陣列或 SAFEARRAY。 |
|
利用做為 1 或 -1 的 True,轉換為 1、2 或 4 個位元組值 |
|
轉換為 Unicode 或 ANSI 字元 |
|
轉換為類別介面 |
|
轉換為 Variant 或介面 |
|
轉換成 C-Style 陣列或 SAFEARRAY。 |
|
轉換為結尾為 null 參考的字串 (在 Visual Basic 中為 Nothing),或轉換為 BSTR |
|
轉換為具有固定記憶體配置的結構 |
|
轉換成 C-Style 陣列或 SAFEARRAY。 |
類別和物件型別只受到 COM Interop 的支援。如需 Visual Basic 2005、C# 和 C++ 中的對應型別,請參閱 .NET Framework 類別庫的簡介。