ブリット可能なタイプ


Blittable_types

Blittableタイプは、Microsoft .NET Frameworkのデータ型であり、マネージコードとアンマネージコードの両方でメモリ内に同じ表示がブリット可能タイプとブリット不可能タイプの違いを理解すると、.NETアプリケーションの相互運用性のための2つの手法であるCOM相互運用機能またはP / Invokeの使用に役立ちます。

コンテンツ
1 元
2 相互運用性の概要
3 定義されたBlittableタイプ
4 使用法
5 も参照してください
6 参考文献
7 外部リンク


メモリコピー操作は、ブロック転送と呼ばれることもあり、ビットブリットに短縮されます(このような転送を行うための専用ハードウェアはブリッターと呼ばれます)。Blittableは、ブロック転送を使用してオブジェクトをコピーすることが合法かどうかを表す.NET固有の用語です。

相互運用性の概要
相互運用性は、アンマネージコードとマネージ.NETコードの間でデータとメソッドを双方向に共有することです。.NETは、COM相互運用とP / Invokeの2つの相互運用方法を提供します。方法は異なりますが、どちらの場合もマーシャリング(データの表現、関数を呼び出すための形式、および値を返すための形式の間の変換)を実行する必要がCOM相互運用機能はマネージコードとCOMオブジェクト間のこの変換を処理しますが、P / InvokeはマネージコードとWin32コード間の相互作用を処理します。ブリット可能およびブリット不可能なデータ型の概念は、両方に適用されます。特に、マネージメモリとアンマネージメモリの間でデータを変換する問題に適用されます。このマーシャリングは、必要に応じてCLRによって自動的に呼び出される相互運用マーシャラーによって実行されます。

定義されたBlittableタイプ
blittableタイプは、デフォルトでマネージドメモリとアンマネージドメモリで共通の表現を持つため、相互運用マーシャラーからの特別な注意を必要としないデータ型です。データをメモリに固定することにより、ガベージコレクタはデータを移動できなくなり、アンマネージアプリケーションとインプレースで共有できるようになります。これは、マネージコードとアンマネージコードの両方がこれらのタイプのメモリ位置を一貫した方法で変更し、データの整合性を維持するためにマーシャラーが必要とする労力がはるかに少ないことを意味します。以下は、.NETFrameworkで使用可能なblittableタイプの例です。 System.Byte System.SByte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64System.UInt64 System.IntPtr System.UIntPtr System.Single System.Double
さらに、これらのタイプの1次元配列(安全でない固定バッファーを含む)、およびこれらのタイプのインスタンスフィールド(読み取り専用フィールドを含む)のみを含む複合型はブリット可能です。ブリット不可能な静的フィールドまたはconstフィールドが存在しても、そのようなフィールドはマーシャリングに関与しないため、タイプがブリット不可能になることはありません。複合型(つまり、構造体またはクラス)も、.NETマーシャラーによってブリット可能と見なされるために、[StructLayout]属性を使用して適用されるSequentialのインスタンスフィールドレイアウトを持っている必要が構造体にはこの属性がコンパイラーによって自動的に適用されますが、それ以外の場合はブリット可能でないクラスをブリット可能にするために、クラス定義に明示的に追加する必要が
タイプがblittableタイプのいずれでもない場合、そのタイプは非blittableとして分類されます。タイプが非ブリット可能と見なされる理由は、マネージメモリ内の1つの表現に対して、アンマネージメモリ内に複数の潜在的な表現がある場合があるためです。または、マネージメモリとアンマネージメモリの両方に、タイプの表現が1つだけ存在する場合もまた、どちらかの側に単に表現がない場合もよく以下は、.NETFrameworkで一般的に使用される非blittableタイプです。System.Boolean System.Char System.Object System.String
ブリット可能タイプとブリット不可能タイプは他にもたくさんあり、ユーザー定義タイプは、定義方法(MSDN)に応じて、どちらのカテゴリにも当てはまります。

使用法
ブリット可能なタイプのこの非常に制限的な概念は、.NETによって提供される相互運用性サービスの有用性を制限しているように見えますが、そうではありません。ブリット可能型を使用すると、相互運用可能な型を簡単に定義できますが、相互運用性マーシャラーが非ブリット可能型を変換する方法を明示的に定義するには、さまざまな方法が たとえば、.NET言語には、型のフィールド、型自体、およびそれらの特定のデータの処理方法をマーシャラーに示すメソッドパラメーターに適用できる多くの属性がこれらの属性には、型のパッキングまたは配置の詳細、型内のフィールドのオフセットの指定、配列または文字列表現の指定、関数呼び出しのパラメーター受け渡しスタイルの制御、メモリ管理手法の指定など、さまざまな目的がフレームワークで提供される属性または他のツールのいずれも適切でない場合、ICustomMarshaler インターフェイスを実装し、双方向でデータの変換を手動で実行する機能によって、きめ細かい制御が提供されます。ブリット可能なタイプを構成するものを理解することで、開発者は、タイプを正しくマーシャリングするために介入が必要な状況と不要な状況を特定できます。このようにして、型や関数呼び出しの過剰な指定に費やされる時間が少なくなります。

も参照してください
プラットフォーム呼び出しサービス(P / Invoke)
。ネットフレームワーク
CLI言語のリスト COM 相互運用性
POD

参考文献
^ 「MSDNマガジン-P / InvokeRevisited」。Msdn.microsoft.com 。
^ “MSDN-BlittableおよびNon-Blittableタイプ”。Msdn.microsoft.com 。
^ 「MSDN-相互運用マーシャリングの概要」。Msdn.microsoft.com 。
^ 「MSDN-.NETの相互運用性」。Msdn2.microsoft.com 。

外部リンク
P / Invokeチュートリアル
COM相互運用チュートリアル Pinvoke.net GotDotNet.comでP / Invoke Cheat Sheet
MSDN Magazine-P / Invokeを使用してC#でWin32DLLを呼び出す