「[[マイクロソフト系技術情報 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を使用したリモート・サーバ呼び出し

における「データ変換」を指していることが多い。

**用語 [#u0166921]

-[[マーシャリング]]【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

*相互運用マーシャリング [#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/C%23/Frameworks/Infrastructure/Public/Util/CustomMarshaler.cs

構造体配列のマーシャリングを行う場合は、~
要素数などは別途引数などを用意して把握できるようにしておく必要がある。

**オブジェクトのマーシャリング [#q0ce6bd9]
・・・

*[[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]] に公開する)で使用することも可能。

----
Tags: [[:Windows]], [[:プログラミング]], [[:.NET開発]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS