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 呼び出し可能ラッパーのカスタマイズ

概念

COM のデータ型

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

その他の技術情報

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

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