ClassInterfaceAttribute クラス

インターフェイスが生成される場合に、COM に公開されるクラスに対して生成されるクラス インターフェイスの型を示します。

この型のすべてのメンバの一覧については、ClassInterfaceAttribute メンバ を参照してください。

System.Object
   System.Attribute
      System.Runtime.InteropServices.ClassInterfaceAttribute

<AttributeUsage(AttributeTargets.Assembly Or _
   AttributeTargets.Class)>
NotInheritable Public Class ClassInterfaceAttribute   Inherits Attribute
[C#]
[AttributeUsage(AttributeTargets.Assembly |
   AttributeTargets.Class)]
public sealed class ClassInterfaceAttribute : Attribute
[C++]
[AttributeUsage(AttributeTargets::Assembly |
   AttributeTargets::Class)]
public __gc __sealed class ClassInterfaceAttribute : public   Attribute
[JScript]
public
   AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class)
class ClassInterfaceAttribute extends Attribute

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

この属性は、アセンブリまたはクラスに適用できます。

この属性は、 タイプ ライブラリ エクスポータ (Tlbexp.exe) が属性付きのクラスに対してクラス インターフェイスを自動的に生成するかどうかを制御します。クラス インターフェイスの名前は、クラス自体と同じですが、プリフィックスとしてアンダースコアが付きます。公開されると、クラス インターフェイスには、基本クラスから継承したメンバのほか、マネージ クラスのすべての public メンバと非静的 (Visual Basic では Shared) メンバが含まれます。マネージ クラスからクラス インターフェイスにはアクセスできませんが、マネージ クラスの場合はメンバに直接アクセスできるため、その必要はありません。Tlbexp.exe は、クラス インターフェイスに対して一意のインターフェイス ID (IID) を生成します。

クラス インターフェイスには、デュアル インターフェイスとディスパッチ専用インターフェイスがあります。必要があれば、クラス インターフェイスを生成せずに、代わりにカスタム インターフェイスを提供することもできます。クラス インターフェイスを公開するかどうかは、 System.Runtime.InteropServices.ClassInterfaceType 列挙体メンバを使用して指定します。 ClassInterfaceAttribute をアセンブリに適用した場合、個々のクラスがそれぞれの属性で設定をオーバーライドしていない限り、この属性はアセンブリ内のすべてのクラスに適用されます。

クラス インターフェイスを使用すると、クラスごとにインターフェイスを明示的に定義する必要がなくなりますが、本運用のアプリケーションでこれを使用することはできる限り避けてください。デュアル クラス インターフェイスは、クライアントが、クラスの変化による影響を受けやすい特定のインターフェイス レイアウトにバインドできるようにします。たとえば、クラス インターフェイスを COM クライアントに公開するマネージ クラスについて考えてみます。最初のバージョンのクラスは、 North メソッドと South メソッドを含んでいます。アンマネージ クライアントは、1 番目のメソッドとして North 、2 番目のメソッドとして South を提供するクラス インターフェイスにバインドできます。次に、メソッド NorthSouth の間に新しい East メソッドを挿入した、同じクラスの次のバージョンについて考えます。アンマネージ クライアントが以前のクラス インターフェイスを通じて新しいクラスにバインドしようとした場合は、インターフェイス内のメソッドの位置が変更されてしまっているため、 South メソッドを呼び出そうとしたときに、 East メソッドが呼び出されてしまうことになります。さらに、基本クラスのレイアウトを変更すると、すべての派生クラスのクラス インターフェイスのレイアウトにも影響があります。クラスに直接バインドするマネージ クライアントでは、このようなバージョン問題が発生しません。クラス インターフェイスの使用に関するガイドラインについては、「 クラス インターフェイスの概要 」を参照してください。

タイプ ライブラリ インポータ (Tlbimp.exe) は、既存の COM クラスがマネージ インターフェイスを公開することはないことを示すために、 ClassInterfaceType.None 列挙体メンバをインポートされたクラスに対して常に適用します。

使用例

[Visual Basic, C#, C++] ClassInterfaceTypeAutoDispatch を指定して ClassInterfaceAttribute を適用し、 MyClassIDispatch インターフェイスを生成する例を次に示します。

 
Imports System.Runtime.InteropServices

<ClassInterface(ClassInterfaceType.AutoDispatch)> _
Public Class SampleClass    
    ' Insert class members here.
End Class

[C#] 
using System.Runtime.InteropServices;

[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class MyClass
{
   public MyClass() {}
}

[C++] 
using namespace System::Runtime::InteropServices;

[ClassInterface(ClassInterfaceType::AutoDispatch)]
public __gc class MyClass
{
public:
   MyClass() {}
};

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Runtime.InteropServices

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

ClassInterfaceAttribute メンバ | System.Runtime.InteropServices 名前空間 | ClassInterfaceType | タイプ ライブラリ エクスポータ (Tlbexp.exe) | タイプ ライブラリ インポータ (Tlbimp.exe)