マーシャリングの概要
更新 : 2007 年 11 月
.NET Compact Framework version 2.0 では、IDispatch、プラットフォーム呼び出し、および vtable 呼び出しによって、拡張されたマーシャリングがサポートされています。次のような項目がサポートされています。
MarshalAsAttribute 属性の使用
Windows Embedded CE でサポートされるバリアント型のマーシャリング
vtable 経由で COM インターフェイスを呼び出す型のマーシャリング
配列と文字列が埋め込まれた構造体のマーシャリング
構造体のレイアウトの指定
次の型は、値渡しまたは参照渡しでマーシャリングできます。
BStr
IUnknown
IDispatch
SafeArray
DateTime (OLE の DATE としてマーシャリングされます)
Variant
.NET Compact Framework 2.0 で AllocHGlobal メソッドと FreeHGlobal メソッドがサポートされることに注意してください。
Interop ログ
関数シグネチャのログ ファイルを作成し、相互運用の呼び出しのマーシャリング内容を確認できます。このファイルの作成方法の詳細については、「方法 : ログ ファイルを作成する」を参照してください。ログ ファイルの解釈方法の詳細については、「ログ ファイル情報」を参照してください。
マーシャリングについて完全な .NET Framework と異なる点
.NET Compact Framework では、完全な .NET Framework に含まれる次のマーシャリング機能と相互運用機能がサポートされません。
カスタム マーシャリング
GetDelegateForFunctionPointer メソッドを使用して、ネイティブの関数ポインタからマネージ デリゲートを取得します。一方で、マネージ デリゲートからネイティブの関数ポインタを作成できます。
ネイティブ コンポーネントからの .NET Compact Framework クラスへのアクセス
IDispatch 経由で構造体 (VT_RECORD) を渡します。
IDispatch 経由で Int64 型と UInt64 型を渡します。
マーシャリング動作の点で、.NET Compact Framework は完全な .NET Framework と次のように異なっています。
.NET Compact Framework では SCODE 値の配列をマーシャリングできますが、完全な .NET Framework ではできません。
.NET Compact Framework は、完全な .NET Framework とは異なる方法で、IUnknown ポインタおよび IDispatch ポインタの配列をマーシャリングします。
.NET Compact Framework は、すべてのスレッドをマルチスレッドのアパートメントとして初期化します。他のスレッド処理モデルやアパートメント モデル設定はサポートされません。このため、.NET Compact Framework では、ApartmentState プロパティおよび次のメソッドがサポートされません。
Visual Basic の Declare ステートメントを使用したマーシャリング
DLL 内の外部プロシージャへの参照を宣言 (declare) する別の方法として、Visual Basic の Declare ステートメントがあります。Declare ステートメントの Ansi キーワードはサポートされないことに注意してください。
Declare ステートメントでのマーシャリングは、ByVal String オブジェクトを除いて、DllImportAttribute クラスでのマーシャリングと同じです。Declare ステートメントでは、ByVal String パラメータは出力パラメータとしてマーシャリングされます。文字列は変更できないため、共通言語ランタイムは文字列をコピーして新しい参照を返します。
IDispatch とプラットフォーム呼び出しのマーシャラの違い
2 つのマーシャラでマーシャリング方法が異なる型を次の表に示します。
型 |
IDispatch |
プラットフォーム呼び出しと vtable |
---|---|---|
BStr |
wchar* |
|
Variant |
NULL |
|
VARIANT_BOOL |
byte |
|
SafeArray |
C スタイルの配列 |
.NET Compact Framework は StructLayoutAttribute を自動レイアウト構造体として使用せずに、プラットフォーム呼び出しを介してクラスをマーシャリングします。完全な .NET Framework は COM 呼び出し可能ラッパー (CCW) としてマーシャリングします。
.NET Compact Framework では SafeArray が FADF_FIXEDSIZE とマークされ、ネイティブ コードでサイズを変更した場合に例外がスローされることに注意してください。
Boolean がネイティブのバイト型に変換される状況では、Boolean を戻り値の型としてマーシャリングすることはできません。引数としてのみ、マーシャリングできます。
デリゲートのマーシャリング
既定で、デリゲートは、関数ポインタとしてマーシャリングされます。MarshalAsAttribute のインスタンスを作成する場合、UnmanagedType 列挙体から明示的に FunctionPtr 値を使用することもできます。例については「関数ポインタとしてのデリゲートのマーシャリング」を参照してください。
文字セットの指定
プラットフォーム呼び出しによって文字列をマーシャリングするときに、DllImportAttribute の CharSet を使用して文字セットを指定できます。
.NET Compact Framework は、次の 2 つの値をサポートしています。
Auto. 文字列は、オペレーティング システムの適切な文字セット、つまり Unicode 文字セットを使ってマーシャリングされます。これが既定値です。
Unicode. 文字列は Unicode 文字セットを使ってマーシャリングされます。
Windows Embedded CE は Unicode のみであるため、Ansi 値はサポートされません。None は Ansi と同等であり、サポートされません。
.NET Compact Framework は ExactSpelling フィールドをサポートしないため、CharSet で指定された値に基づいて、共通言語ランタイムが自動的にエントリ ポイントを検索します。
オブジェクトの固定
.NET Compact Framework の共通言語ランタイムがオブジェクトをマーシャリングするときには、ガベージ コレクタがそのオブジェクトを解放または移動しないように、プラットフォーム呼び出しの間、そのオブジェクトが固定されます。
メモリ使用状況
.NET Compact Framework でアンマネージ コードを使ってメモリを処理するときは、次のガイドラインに従います。
メモリは常にマネージ コードで割り当て、アンマネージ コードに渡します。
アンマネージ コードがマネージ コンポーネントへのポインタを保持する場合は、GCHandle 構造体を使ってオブジェクトを手動で固定する必要があります。
.NET Compact Framework 共通言語ランタイムは、起動時にスレッドを初期化し、シャットダウン時に初期化解除します。スレッドは、"フリー スレッド" になります。