Blittable 型と非 Blittable 型

ほとんどのデータ型の表現はマネージドとアンマネージドの両方のメモリで共通しているため、相互運用マーシャラーによる特別な処理は必要ありません。 これらの型は、マネージド コードとアンマネージド コード間での受け渡しの際に変換が必要でないため、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、C#、および C++ の対応する型については、クラス ライブラリの概要に関する記事を参照してください。

関連項目