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 參數,就必須套用 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 類別庫概觀。
請參閱
其他資源
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2010 年 5 月 |
已釐清對套用至結構之傳回型別的限制。 |
內容 Bug 修正。 |