Open棟梁Project - マイクロソフト系技術情報 Wiki -[[戻る>マネージドコードとアンマネージドコードのブリッジ]] * 目次 [#j5603727] #contents *概要 [#u0002f12] ココに書いている通り。 -マーシャリング【marshalling】の意味 - 国語辞書 - goo辞書~ http://dictionary.goo.ne.jp/leaf/jn2/206616/m0u/ マイクロソフト技術書では、 -マネージ(.NET)・アンマネージ(C/C++)コード間の相互運用 -COMを使用したイン・プロセス呼び出し -COMを使用した別・プロセス呼び出し -DCOMを使用したリモート・サーバ呼び出し における「データ変換」を指していることが多い。 *相互運用マーシャリング [#na8c2968] マネージコード・アンマネージドコード間のデータ変換 C/C++と.NETでは当然メモリ上のデータの表現が異なる。 >.NETではポインタを直接扱うことができないし、~ オブジェクトはGC(ガベージコレクタ)などで管理されている。 マネージ(.NET)からアンマネージ(C/C++)のDLLやCOMを呼び出す場合、~ 相互運用マーシャラーによって、マネージコード・アンマネージドコード間のデータが変換される。 **構造体のマーシャリング [#wd525e6e] Marshalクラスを使用して構造体のマーシャリングが可能。 構造体配列、構造体配列配列、構造体配列の階層構造など。 -Marshalクラス~ http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal.aspx -CustomMarshalerクラス~ https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Util/CustomMarshaler.cs 構造体配列のマーシャリングを行う場合は、~ 要素数などは別途引数などを用意して把握できるようにしておく必要がある。 *COM [#bfce287a] **COMを使用したイン・プロセス呼び出し [#s729c730] 生成済みの[[STA]]のCOMコンポーネントのポインタを使用して~ マルチスレッド・クライアントから呼び出した場合、~ Windwosメッセージキューによって呼び出しが直列化される。~ これもマーシャリングの一種である。 **COMを使用した別・プロセス呼び出し [#i87c7299] ローカル・プロセスの引数・戻り値のデータをリモート・プロセスにコピーする。 **DCOMを使用したリモート・サーバ呼び出し [#ze384a8b] ローカル・プロセスの引数・戻り値のデータをリモート・サーバのプロセスにコピーする。 **カスタムマーシャリング [#ea423189] COMのカスタムマーシャリングを説明にするには、~ ADODB.Recordsetのマーシャリングなどが良いサンプルになる。 -ADODB.Recordsetのポインタを渡すとプロセス間を超えて、~ ADODB.Recordsetのオブジェクト階層がコピーされる。 -プロセスA、プロセスBでADODB.Recordsetのポインタが共有されている場合、~ プロセスAでADODB.RecordsetにAddNewメソッドを呼び出し行を追加すると、~ プロセス間を超えてプロセスBのADODB.Recordsetに行が追加される。 また、カスタムマーシャリングを相互運用(マネージ型を COM に公開する)で使用することも可能。