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
を提供するクラス インターフェイスにバインドできます。次に、メソッド North
と South
の間に新しい East
メソッドを挿入した、同じクラスの次のバージョンについて考えます。アンマネージ クライアントが以前のクラス インターフェイスを通じて新しいクラスにバインドしようとした場合は、インターフェイス内のメソッドの位置が変更されてしまっているため、 South
メソッドを呼び出そうとしたときに、 East
メソッドが呼び出されてしまうことになります。さらに、基本クラスのレイアウトを変更すると、すべての派生クラスのクラス インターフェイスのレイアウトにも影響があります。クラスに直接バインドするマネージ クライアントでは、このようなバージョン問題が発生しません。クラス インターフェイスの使用に関するガイドラインについては、「 クラス インターフェイスの概要 」を参照してください。
タイプ ライブラリ インポータ (Tlbimp.exe) は、既存の COM クラスがマネージ インターフェイスを公開することはないことを示すために、 ClassInterfaceType.None 列挙体メンバをインポートされたクラスに対して常に適用します。
使用例
[Visual Basic, C#, C++] ClassInterfaceType に AutoDispatch を指定して ClassInterfaceAttribute を適用し、 MyClass
の IDispatch インターフェイスを生成する例を次に示します。
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)