C++ におけるマーシャリングの概要

混合モードでは、ネイティブ型とマネージ型の間でのデータのマーシャリングが必要になる場合があります。Visual Studio 2008 には、データのマーシャリングと変換を簡単に行うためのマーシャリング ライブラリが導入されています。

マーシャリング ライブラリは、marshal_context クラスの有無に関係なく使用できます。一部の変換ではコンテキストが必要になります。marshal_as 関数を使用して実装できる変換もあります。次の表は、現在サポートされている変換、それぞれの変換にコンテキストが必要かどうか、およびインクルードする必要のあるマーシャル ファイルの一覧です。

変換前の型

変換後の型

マーシャル メソッド

インクルード ファイル

System::String^

const char*

marshal_context

marshal.h

const char*

System::String^

marshal_as

marshal.h

char*

System::String^

marshal_as

marshal.h

System::String^

const wchar_t *

marshal_context

marshal.h

const wchar_t *

System::String^

marshal_as

marshal.h

wchar_t*

System::String^

marshal_as

marshal.h

System::IntPtr

HANDLE

marshal_as

marshal_windows.h

HANDLE

System::IntPtr

marshal_as

marshal_windows.h

System::String^

BSTR

marshal_context

marshal_windows.h

BSTR

System::String^

marshal_as

marshal.h

System::String^

bstr_t

marshal_as

marshal_windows.h

bstr_t

System::String^

marshal_as

marshal_windows.h

System::String^

std::string

marshal_as

marshal_cppstd.h

std::string

System::String^

marshal_as

marshal_cppstd.h

System::String^

std::wstring

marshal_as

marshal_cppstd.h

std::wstring

System::String^

marshal_as

marshal_cppstd.h

System::String^

CStringT<char>

marshal_as

marshal_atl.h

CStringT<char>

System::String^

marshal_as

marshal_atl.h

System::String^

CStringT<wchar_t>

marshal_as

marshal_atl.h

CStringT<wchar_t>

System::String^

marshal_as

marshal_atl.h

System::String^

CComBSTR

marshal_as

marshal_atl.h

CComBSTR

System::String^

marshal_as

marshal_atl.h

マーシャリングでコンテキストが必要となるのは、マネージ データ型からネイティブ データ型へのマーシャリングで、変換先のネイティブ型に自動クリーンアップを行うためのデストラクタがない場合だけです。マーシャリング コンテキストは、割り当てられたネイティブ データ型をそのデストラクタで破棄します。したがって、コンテキストを必要とする変換は、コンテキストが削除されると無効になります。マーシャリングされた値を保存するには、独自の変数に値をコピーする必要があります。

Bb384865.alert_note(ja-jp,VS.90).gifメモ :

複数の NULL が埋め込まれている文字列に対してマーシャリングを行うと、予期しない結果になる場合があります。文字列に NULL が埋め込まれていると、それが原因で文字列が切り捨てられる可能性があります。切り捨てられずに保持される場合もあります。

マーシャリング ライブラリは拡張可能なので、独自のマーシャリング型を追加できます。マーシャリング ライブラリの拡張の詳細については、「方法 : マーシャリング ライブラリを拡張する」を参照してください。

以前のバージョンでは、プラットフォーム呼び出しを使用してデータをマーシャリングすることができました。PInvoke の詳細については、「マネージ コードからのネイティブ関数の呼び出し」を参照してください。

参照

概念

C++ のサポート ライブラリ

方法 : マーシャリング ライブラリを拡張する