マーシャリングとは何ですか?なぜ必要なのですか?
int
をC#からCに送信することはできず、マーシャルする必要があるとは信じられません。なぜC#が開始および終了信号で32ビットを送信して、Cコードにint
を受信したことを伝えることができないのですか?
マーシャリングが必要な理由とその使用方法に関する優れたチュートリアルまたはサイトがあれば、それは素晴らしいことです。
言語と環境が異なると、呼び出し規約、レイアウト規約、プリミティブのサイズ(C#のchar
とCのchar
を参照)、オブジェクトの作成/破棄の規約、デザインが異なるためです。ガイドライン。管理された土地から、管理されていない土地がそれを見て理解できる場所、またはその逆の場所に物を運ぶ方法が必要です。それがマーシャリングの目的です。
.NETコード(C#、VB)は、CLRによって「管理」されているため、「管理」と呼ばれます( Common Language Runtime )
C、C++、またはアセンブラでコードを記述する場合、CLRは関係しないため、すべて「アンマネージド」と呼ばれます。すべてのメモリの割り当て/割り当て解除はユーザーの責任です。
マーシャリングは、マネージコードとアンマネージコード間のプロセスです。これは[〜#〜] clr [〜#〜]が提供する最も重要なサービスの1つです。
int
のマーシャリングは、理想的にはあなたが言ったことだけです。CLRのマネージスタックからCコードが参照できる場所にメモリをコピーします。文字列、オブジェクト、配列、およびその他の型のマーシャリングは難しいものです。
ただし、P/Invoke相互運用層は、これらのほとんどすべてを処理します。
Vinkoがコメントで述べているように、特別なマーシャリングなしでプリミティブ型を渡すことができます。これらは「blittable」タイプと呼ばれ、byte、short、int、longなどのタイプと、それに対応する符号なしのタイプが含まれます。
このページには、 blittableおよびnon-blittableタイプ のリストが含まれています。
マーシャリングは、ピンボークを使用して、管理されていない世界のデータ型と通信するためのより良いWordまたはゲートウェイの不足のための「媒体」であり、データが安全な方法で返されることを保証します。
マーシャリングは、異なるマシン上にある別のプロセスに関数の署名を渡すことであり、通常、構造化データを専用の形式に変換することで実装されます。