COM 呼び出し可能ラッパーのカスタマイズ
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)
' ...
End Sub
void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
// ...
}
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 = "";
}
ref class MsgText
{
public:
[MarshalAs(UnmanagedType::LPWStr)]
String^ msg;
MsgText()
{
msg = "";
}
};
戻り値への MarshalAsAttribute の適用
Public Function M2() As <MarshalAs(UnmanagedType.LPWStr)> String
Dim msg As New String(New char(128){})
' Load message here ...
Return msg
End Function
[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
string msg = new string(new char[128]);
// Load message here ...
return msg;
}
[returnvalue: MarshalAs(UnmanagedType::LPWStr)]
String^ GetMessage()
{
String^ msg = gcnew String(gcnew array<Char>(128));
// Load message here ...
return msg;
}
アンマネージ型について目的の形式を指定するには、System.Runtime.InteropServices.UnmanagedType 列挙体を設定します。 上のシグネチャの場合、msg データは Unicode 文字の null で終わるバッファー (LPWStr) としてマーシャリングされます。
場合によっては、マネージ データ形式およびアンマネージ データ形式から与えられる以上の情報を相互運用マーシャラーが必要とすることがあります。 たとえば、配列をマーシャリングするには、配列の要素の型、ランク、サイズ、および上下限を指定する必要があります。 MarshalAsAttribute を使用すると、このような必要な追加情報を指定できます。
参照
参照
COM 呼び出し可能ラッパーのカスタマイズ