Share via


COM への機能公開のガイドライン

共通言語ランタイムには、COM コンポーネントとの相互運用性をサポートする豊富な機能が用意されています。COM コンポーネントをマネージ型の内部から使用でき、マネージ インスタンスを COM コンポーネントから使用できます。このサポートによって、アンマネージ コードからマネージ コードにコード片単位で移動できますが、クラス ライブラリ デザイナにとっては、いくつかの問題が浮上します。マネージ型を COM クライアントに完全に公開するには、COM でサポートされていて COM バージョン管理規則に準拠する方法で、その型の機能を公開する必要があります。

ComVisibleAttribute 属性でマネージ クラス ライブラリをマークし、COM クライアントがライブラリを直接使用できるかどうかや、ライブラリを使用するためには、機能を形成するラッパーを使用する必要があるかどうかを示します。

アンマネージ コンテナで管理する場合など、COM クライアントから直接使用できるようにする必要がある型とインターフェイスは、ComVisible(true) 属性でマークする必要があります。公開済みの型から参照されるすべての型の推移的閉包は、ComVisible(true) として明示的にマークする必要があります。マークしない場合は、IUnknown として公開されます。

メモ   型のメンバは、ComVisible(false) としてマークすることもできます。これによって、COM への公開頻度が減少するため、マネージ型が使用できる対象についての制限も緩和されます。

ComVisible(true) 属性でマークされた型は、COM から使用できない方法で機能を排他的に公開することはできません。特に、COM は静的メソッドまたはパラメータ付きコンストラクタをサポートしません。型の機能を COM クライアントからテストし、正常に動作するかどうかを確認してください。すべての型を共同で作成できるようにすることによるレジストリへの影響についても把握しておく必要があります。

参照渡しのマーシャリング

参照渡しのマーシャリング オブジェクトは、リモート処理可能オブジェクトです。オブジェクトのリモート処理は、次の 3 種類の型に適用されます。

  • アプリケーション ドメイン境界を超えて (同じコンピュータ上または異なるコンピュータ上で) マーシャリングされるときにインスタンスがコピーされる型。これらの型は、Serializable 属性でマークする必要があります。
  • アプリケーション ドメイン境界を超えて (同じコンピュータ上または異なるコンピュータ上で) マーシャリングされるときにランタイムによって透過プロキシが作成される型。これらの型は、最終的には System.MarshalByRefObject クラスから派生させる必要があります。
  • アプリケーション ドメインを超えてマーシャリングされない型。これは、既定の設定です。

参照渡しでマーシャリングするときは、次のガイドラインに準拠してください。

  • 既定では、インスタンスは値渡しのマーシャリング オブジェクトにします。つまり、型を Serializable としてマークします。
  • コンポーネント型は、参照渡しのマーシャリング オブジェクトにします。このことは、共通の基本クラスである System.Component クラスが参照渡しのマーシャリング クラスであるため、既にほとんどのコンポーネントに当てはまっています。
  • 型がオペレーティング システム リソースをカプセル化する場合は、その型を参照渡しのマーシャリング オブジェクトにします。型が IDisposable インターフェイスを実装する場合は、多くの場合、その型は参照渡しでマーシャリングする必要があります。System.IO.Stream は、MarshalByRefObject から派生します。FileStreams や NetworkStreams などの多くのストリームは、外部リソースをカプセル化するため、参照渡しのマーシャリング オブジェクトにします。
  • 単純に状態を保持するインスタンスは、値渡しのマーシャリング オブジェクト (DataSet など) にします。
  • アプリケーション ドメインを超えて呼び出すことができない特殊な型 (静的ユーティリティ メソッドのホルダなど) は、Serializable としてマークしません。

参照

クラス ライブラリ開発者向けのデザイン ガイドライン | MarshalByRefObject クラス | COM への .NET Framework コンポーネントの公開