分享方式:


Blittable 和非 Blittable 類型

大部分的資料類型在 Managed 和 Unmanaged 記憶體中都有共同的呈現,而且不需要 Interop 封送處理器的特殊處理。 這些類型稱為「Blittable 類型」,因為它們在 Managed 與 Unmanaged 程式碼之間傳遞時不需要進行轉換。

從平台叫用呼叫傳回的結構必須是 Blittable 類型。 平台叫用不支援非 Blittable 結構作為傳回類型。

System 命名空間中的下列類型是 Blittable 類型:

下列複雜類型也是 Blittable 類型:

  • Blittable 基本類型的一維陣列 (例如整數陣列)。 不過,包含 Blittable 類型之可變陣列的類型本身不是 Blittable。

  • 只包含 Blittable 類型 (將它們封送處理為格式化類型時也包含類別) 的格式化實值型別。 如需格式化實值型別的詳細資訊,請參閱實值型別的預設封送處理

物件參考不是 Blittable。 這包含自行 Blittable 之物件參考的陣列。 例如,您可以定義 Blittable 結構,但無法定義包含這些結構參考之陣列的 Blittable 類型。

進行最佳化時,在封送處理期間,會釘選 Blittable 基本類型以及只包含 Blittable 成員之類別的陣列,而不是複製。 呼叫者和被呼叫者位於相同的 Apartment 時,可以將這些類型封送處理為 In/Out 參數。 不過,會將這些類型實際封送處理為 In 參數;而且,如果您想要將引數封送處理為 In/Out 參數,則您必須套用 InAttributeOutAttribute 屬性。

部分 Managed 資料類型需要 Unmanaged 環境中有不同的呈現。 這些非 Blittable 資料類型必須轉換成可封送處理的形式。 例如,Managed 字串是非 Blittable 類型,因為它們必須先轉換成字串物件,才能進行封送處理。

下表列出 System 命名空間中的非 Blittable 類型。 委派 (這是參照靜態方法或類別執行個體的資料結構) 也是非 Blittable。

非 Blittable 類型 描述
System.Array 轉換成 C 樣式陣列或 SAFEARRAY
System.Boolean 轉換成 true 為 1 或 -1 的 1、2 或 4 位元組值。
System.Char 轉換成 Unicode 或 ANSI 字元。
System.Class 轉換成類別介面。
System.Object 轉換成變異值或介面。
System.String 轉換成 Null 參考中的字串終止,或轉換成 BSTR。
System.ValueType 轉換成具有固定記憶體配置的結構。
T[] 轉換成 C 樣式陣列或 SAFEARRAY

COM Interop 只能支援類別和物件類型。 如需 Visual Basic、C# 和 C++ 中的對應類型,請參閱類別庫概觀

另請參閱