CoClass属性
CoClassAttributeの本来の目的であるCOM interopはさておき、CoClass属性を使うと、次の例のように見かけ上インターフェイスを直接new
する、インターフェイスに対してデフォルト実装クラスを定義するようなことができる。
インターフェイスI
に対するnew
は、コンパイル時において、CoClass属性で指定されたコクラスC
に対するnew
に置き換えられる。
シグニチャがマッチする、かつアクセス可能なコンストラクタが存在する場合は、引数付きでnew
することもできる。 引数リストと一致するアクセス可能なコンストラクタがなければコンパイルエラーとなる(実行時例外ではない)。
アセンブリ境界を跨ぐ場合、コクラスにアクセスできなければコンパイルエラーとなる(実行時例外ではない)。 このため、ライブラリにてインターフェイスとデフォルト実装(CoClass属性)のみを公開しつつ、デフォルト実装クラスは非公開とする、といったことはできない。
ComImport属性とGuid属性
C#でCoClass属性をインターフェイスに付与する場合、ComImport属性とGuid属性も同時に付与する必要がある。 Guid属性で指定するGUIDは適当でよい(COM importを目的としないのであれば)。
VBでCoClass属性をインターフェイスに付与する場合は、ComImport属性とGuid属性は必ずしも付与する必要がなく、コンパイル時に自動的に付与されるわけでもない模様。