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