Blittable 型と非 Blittable 型

更新 : 2010 年 5 月

多くのデータ型の場合、マネージ メモリでもアンマネージ メモリでもその表現は共通するため、相互運用マーシャラーによる特別な処理は必要ありません。 これらの型は、マネージ コードとアンマネージ コード間で受け渡しするときに変換する必要がないため、blittable 型と呼ばれます。

プラットフォーム呼び出しから返される構造体は blittable 型であることが必要です。 プラットフォーム呼び出しでは、戻り値の型として非 blittable 型の構造体をサポートしません。

System 名前空間に属する次の型は blittable 型です。

次の複合型も blittable 型です。

  • 整数の配列など、blittable 型の 1 次元配列。 ただし、blittable 型の可変配列を含む型自体は blittable ではありません。

  • blittable 型だけを含む、書式指定された値型 (および、それらが書式指定された型としてマーシャリングされる場合はクラス)。 書式指定された値型の詳細については、「値型に対する既定のマーシャリング」を参照してください。

オブジェクト参照は blittable ではありません。 これには、単独では blittable なオブジェクトへの参照の配列も含まれます。 たとえば、blittable な構造体は定義できますが、それらの構造体への参照の配列を含む blittable 型は定義できません。

blittable 型の配列と、blittable 型のメンバーだけを含むクラスは、最適化のために、マーシャリング時にコピーされるのではなく固定されます。 これらの型は、呼び出し元と呼び出し先が同じアパートメントに属する場合には、In/Out パラメーターとしてマーシャリングされるように見えることがあります。 ただし、そのような型は実際には In パラメーターとしてマーシャリングされるため、引数を In/Out パラメーターとしてマーシャリングする必要がある場合には、InAttribute 属性と OutAttribute 属性を適用する必要があります。

一部のマネージ データ型は、アンマネージ環境では異なる表現が必要です。 これらの非 blittable データ型は、マーシャリングできる形式に変換する必要があります。 たとえば、マネージ文字列は、文字列オブジェクトに変換しないとマーシャリングできないので、非 blittable 型です。

System 名前空間に属する非 blittable 型を次の表に示します。 デリゲートは静的メソッドまたはクラス インスタンスを参照するデータ構造体ですが、これも非 blittable 型です。

非 blittable 型

説明

System.Array

C スタイルの配列または SAFEARRAY に変換されます。

System.Boolean

1、2、または 4 バイトの値に変換されます。true の場合は 1、それ以外の場合は -1 になります。

System.Char

Unicode 文字または ANSI 文字に変換されます。

System.Class

クラス インターフェイスに変換されます。

System.Object

バリアントまたはインターフェイスに変換されます。

System.Mdarray

C スタイルの配列または SAFEARRAY に変換されます。

System.String

null 参照で終わる文字列または BSTR に変換されます。

System.Valuetype

固定メモリ レイアウトを持つ構造体に変換されます。

System.Szarray

C スタイルの配列または SAFEARRAY に変換されます。

クラス型とオブジェクト型は COM 相互運用機能によってだけサポートされます。 Visual Basic 2005、C#、および C++ の対応する型については、「.NET Framework クラス ライブラリの概要」を参照してください。

参照

その他の技術情報

既定のマーシャリングの動作

履歴の変更

日付

履歴

理由

2010 年 5 月

構造体には戻り値の型に関する制限が適用されることを明記しました。

コンテンツ バグ修正