「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>マネージドコードとアンマネージドコードのブリッジ]] * 目次 [#j5603727] #contents *概要 [#u0002f12] マイクロソフト技術書では、 -マネージ(.NET)・アンマネージ(C/C++)コード間の相互運用 -[[COM]]を使用したイン・プロセス呼び出し -[[COM]]を使用した別・プロセス呼び出し -DCOMを使用したリモート・サーバ呼び出し における「データ変換」を指していることが多い。 -マーシャリングの「Marshal」は、 --一般的には~ 「鉄道 操車場」~ (分岐器、ハンプなどを経て目的の仕分線に送る設備。ヤードとも呼ばれる)~ を意味するが、 --IT用語としては、~ COMなどで実装されていた「マーシャリング」を指し、~ アプリケーション ドメイン、プロセス、開発技術などの~ 各境界を越えて、オブジェクトを転送する技術の総称 >である。 -開発技術の境界を越えるための技術としては、以下のものがある。 --プロセス間・マシン間マーシャリング~ COM、DCOM、COM+でプロセス間・マシン間を超えて分散オブジェクトを呼び出す際に実行される。 --[[マネージドコードとアンマネージドコードのブリッジ]]~ ---.NET型をWin32 DLLで使用可能なデータ型の引数に変換 ---または、その逆。 *相互運用マーシャリング [#na8c2968] マネージコード・アンマネージドコード間のデータ変換のこと。 C/C++と.NETでは当然メモリ上のデータの表現が異なる。 例えば、.NETでは、 -ポインタを直接扱うことができないし、 -オブジェクトはGC(ガベージコレクタ)などで管理されている。 なので、マネージコード・アンマネージドコード間のデータ変換が必要になる。 **プリミティブ型のマーシャリング [#b0acb811] マネージ(.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/CS/Frameworks/Infrastructure/Public/Util/CustomMarshaler.cs 構造体配列のマーシャリングを行う場合は、~ 要素数などは別途引数などを用意して把握できるようにしておく必要がある。 **オブジェクトのマーシャリング [#q0ce6bd9] -MSDN > .NET Frameworkクラス ライブラリ > MarshalByRefObjectクラス~ http://msdn.microsoft.com/ja-jp/library/system.marshalbyrefobject.aspx *[[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]] に公開する)で使用することも可能。 *参考 [#t578d1d1] -[[マーシャリング]]【marshalling】の意味 - 国語辞書 - goo辞書~ http://dictionary.goo.ne.jp/leaf/jn2/206616/m0u/ -IT用語辞典バイナリ --マネージコードとは 「マネージドコード」 (managed code)~ http://www.sophia-it.com/content/%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%BC%E3%83%89 --アンマネージドコードとは 「アンマネージコード」 (unmanaged code)~ http://www.sophia-it.com/content/%E3%82%A2%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%BC%E3%83%89 ---- Tags: [[:Windows]], [[:プログラミング]], [[:.NET開発]]