マーシャリングの概要

更新 : 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

String

BStr

wchar*

Object

Variant

NULL

Boolean

VARIANT_BOOL

byte

Array

SafeArray

C スタイルの配列

.NET Compact Framework は StructLayoutAttribute を自動レイアウト構造体として使用せずに、プラットフォーム呼び出しを介してクラスをマーシャリングします。完全な .NET Framework は COM 呼び出し可能ラッパー (CCW) としてマーシャリングします。

.NET Compact Framework では SafeArray が FADF_FIXEDSIZE とマークされ、ネイティブ コードでサイズを変更した場合に例外がスローされることに注意してください。

Boolean がネイティブのバイト型に変換される状況では、Boolean を戻り値の型としてマーシャリングすることはできません。引数としてのみ、マーシャリングできます。

デリゲートのマーシャリング

既定で、デリゲートは、関数ポインタとしてマーシャリングされます。MarshalAsAttribute のインスタンスを作成する場合、UnmanagedType 列挙体から明示的に FunctionPtr 値を使用することもできます。例については「関数ポインタとしてのデリゲートのマーシャリング」を参照してください。

文字セットの指定

プラットフォーム呼び出しによって文字列をマーシャリングするときに、DllImportAttributeCharSet を使用して文字セットを指定できます。

.NET Compact Framework は、次の 2 つの値をサポートしています。

  • Auto. 文字列は、オペレーティング システムの適切な文字セット、つまり Unicode 文字セットを使ってマーシャリングされます。これが既定値です。

  • Unicode. 文字列は Unicode 文字セットを使ってマーシャリングされます。

Windows Embedded CE は Unicode のみであるため、Ansi 値はサポートされません。NoneAnsi と同等であり、サポートされません。

.NET Compact Framework は ExactSpelling フィールドをサポートしないため、CharSet で指定された値に基づいて、共通言語ランタイムが自動的にエントリ ポイントを検索します。

オブジェクトの固定

.NET Compact Framework の共通言語ランタイムがオブジェクトをマーシャリングするときには、ガベージ コレクタがそのオブジェクトを解放または移動しないように、プラットフォーム呼び出しの間、そのオブジェクトが固定されます。

メモリ使用状況

.NET Compact Framework でアンマネージ コードを使ってメモリを処理するときは、次のガイドラインに従います。

  • メモリは常にマネージ コードで割り当て、アンマネージ コードに渡します。

  • アンマネージ コードがマネージ コンポーネントへのポインタを保持する場合は、GCHandle 構造体を使ってオブジェクトを手動で固定する必要があります。

.NET Compact Framework 共通言語ランタイムは、起動時にスレッドを初期化し、シャットダウン時に初期化解除します。スレッドは、"フリー スレッド" になります。

参照

処理手順

方法 : ログ ファイルを作成する

概念

ログ ファイル情報

その他の技術情報

.NET Compact Framework の相互運用性