COM 呼び出し可能ラッパーのカスタマイズ

更新 : 2007 年 11 月

COM 呼び出し可能ラッパー (CCW: COM Callable Wrapper) のカスタマイズは簡単です。COM クライアントに公開しようとしている型のマーシャリング要件が標準的ではない場合には、メソッド パラメータ、クラス フィールド、または戻り値に System.Runtime.InteropServices.MarshalAsAttribute 属性を適用することで、そのマーシャリング動作を変更します。

次の図に示すように、ラッパー (図の左側) をカスタマイズしなくてもマネージ DLL をエクスポートできます。または、マーシャリング情報をソースに追加し、ソースをコンパイルし、さらにタイプ ライブラリ エクスポータ (Tlbexp.exe) を使用して修正済みの DLL をエクスポートすることで、カスタム ラッパーを生成できます。

エクスポートされた DLL に含まれるマーシャリング情報

タイプ ライブラリ エクスポータ

メモ :

COM に対して公開するすべてのマネージ型、マネージ メソッド、マネージ プロパティ、マネージ フィールド、およびマネージ イベントは、パブリックとしてください。型は、パブリックな既定のコンストラクタを持っている必要があります。このコンストラクタが、COM を通じて呼び出すことができる唯一のコンストラクタです。追加情報については、「相互運用のための .NET 型の要件」を参照してください。

マネージ コードとアンマネージ コードの間でデータをマーシャリングする場合、渡そうとしているデータ表現を相互運用マーシャラが認識できる必要があります。

  • blittable 型の場合、マネージ表現とアンマネージ表現は常に同じです。たとえば、4 バイトの整数は常に 4 バイトの整数にマーシャリングされます。相互運用マーシャラは、マネージ シグネチャを使用してデータ表現を判断します。

  • 非 blittable 型の場合、相互運用マーシャラはメソッド シグネチャからマネージ表現を認識しますが、同じようにアンマネージ表現を認識することはできません。非 blittable 型をマーシャリングする場合は、次のいずれかの技法を使用します。

    • マーシャラがマネージ表現からアンマネージ表現を推論できるようにする。

    • アンマネージ データ表現を明示的に指定する。

たとえば、マネージ コードからアンマネージ コードにマーシャリングする場合、文字列は BSTR 型に変換されます。ただし、明示的に MarshalAsAttribute を適用して文字列を LPWSTR などの別の型にマーシャリングする場合は例外です。この属性を、ソースの型定義内でパラメータ、フィールド、または戻り値に適用する例を次に示します。

パラメータへの MarshalAsAttribute の適用

Public Sub M1
(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
public void M1
([MarshalAs(UnmanagedType.LPWStr)]String msg);

クラス内のフィールドへの MarshalAsAttribute の適用

Class MsgText
<MarshalAs(UnmanagedType.LPWStr)> Public msg As String
End Class
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)] Public String msg;
}

戻り値への MarshalAsAttribute の適用

Public Function M2() _
As <MarshalAs(UnmanagedType.LPWStr)> String
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage();

アンマネージ型について目的の形式を指定するには、System.Runtime.InteropServices.UnmanagedType 列挙体を設定します。上のシグネチャの場合、msg データは Unicode 文字の null で終わるバッファ (LPWStr) としてマーシャリングされます。

場合によっては、マネージ データ形式およびアンマネージ データ形式から与えられる以上の情報を相互運用マーシャラが必要とすることがあります。たとえば、配列をマーシャリングするには、配列の要素の型、ランク、サイズ、および上下限を指定する必要があります。MarshalAsAttribute を使用すると、このような必要な追加情報を指定できます。

参照

概念

COM のデータ型

ランタイム呼び出し可能ラッパーのカスタマイズ

参照

COM 呼び出し可能ラッパーのカスタマイズ

その他の技術情報

COM 相互運用機能によるデータのマーシャリング

既定のマーシャリングの動作