Blittable 和非 Blittable 型別

更新:2010 年 5 月

大部分的資料型別在 Managed 和 Unmanaged 記憶體中都有共同的表示,而且不需要透過 Interop 封送處理器的特殊處理。 這些型別稱為「Blittable 型別」(Blittable Type),因為在 Managed 和 Unmanaged 程式碼之間傳遞時,這個型別並不需要進行轉換。

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

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

以下的複雜型別也是 Blittable 型別:

  • Blittable 型別的一維陣列,例如整數陣列。 然而,包含 Blittable 型別之可變陣列的型別本身,則不是 Blittable。

  • 格式化的值型別,其中只包含 Blittable 型別 (以及類別,如果被封送處理成格式化型別)。 如需格式化的值型別詳細資訊,請參閱實值型別的預設封送處理

物件參考不會是 Blittable。 這些參考包括本身為 Blittable 之物件的參考陣列。 例如,您可以定義本身為 Blittable 的結構,卻不能定義包含這些結構之參考陣列的 Blittable 型別。

因為是最佳化,所以在封送處理時,只包含 Blittable 成員的 Blittable 型別和類別之陣列,會被 Pin 而不會被複製。 當呼叫端和被呼叫端是在相同的 Apartment 時,這些型別可以封送處理為 In/Out 參數。 但是這些型別實際上會封送處理為 In 參數,而且如果您要將引數封送處理為 In/Out 參數,就必須套用 InAttributeOutAttribute 屬性。

部分 Managed 資料型別,在 Unmanaged 環境中需要不同的表示式。 這些非 Blittable 資料型別必須轉換成可以封送處理的格式。 例如,Managed 字串是非 Blittable 型別,因為必須轉換成字串物件才能封送處理。

下表列出 System 命名空間的非 Blittable 型別。 委派是一種參考靜態方法或類別執行個體的資料結構,也是非 Blittable。

非 Blittable 型別

說明

System.Array

轉換成 C-Style 陣列,或 SAFEARRAY。

System.Boolean

轉換為 1、2 或 4 個位元組值,而 true 為 1 或 -1。

System.Char

轉換為 Unicode 或 ANSI 字元。

System.Class

轉換為類別介面。

System.Object

轉換為 Variant 或介面。

System.Mdarray

轉換成 C-Style 陣列,或 SAFEARRAY。

System.String

將 null 參考中的字串結尾轉換成 BSTR。

System.Valuetype

轉換為具有固定記憶體配置的結構。

System.Szarray

轉換成 C-Style 陣列,或 SAFEARRAY。

類別和物件型別只受到 COM Interop 的支援。 如需 Visual Basic 2005、C# 及 C++ 中對應的型別,請參閱 .NET Framework 類別庫概觀

請參閱

其他資源

預設的封送處理行為

變更記錄

日期

記錄

原因

2010 年 5 月

已釐清對套用至結構之傳回型別的限制。

內容 Bug 修正。