CA1408: AutoDual ClassInterfaceType を使用しないでください
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
分類 |
Microsoft.Interoperability |
互換性に影響する変更点 |
あり |
原因
コンポーネント オブジェクト モデル (COM: Component Object Model) から参照可能な型が、ClassInterfaceType の AutoDual 値に設定された ClassInterfaceAttribute 属性でマークされています。
規則の説明
デュアル インターフェイスを使用する型を使用することで、クライアントを特定のインターフェイス レイアウトに対応付けることができます。将来のバージョンで、この型またはその基本型のレイアウトに変更が加えられると、インターフェイスに対応付けられた COM クライアントが切り離されます。既定では、ClassInterfaceAttribute 属性が指定されていない場合、ディスパッチのみのインターフェイスが使用されます。
特にマークされていない限り、すべてのパブリックな非ジェネリック型は、COM 参照可能ですが、すべての非パブリックなジェネリック型は COM 参照不可能です。
違反の修正方法
この規則違反を修正するには、ClassInterfaceAttribute 属性の値を ClassInterfaceType の None に変更し、インターフェイスを明示的に定義します。
警告を抑制する状況
この型のレイアウトとその基本型のレイアウトが将来のバージョンで変更されないことが確実である場合を除いて、この規則による警告は抑制しないでください。
使用例
この規則に違反するクラスと、明示的なインターフェイスを使用するクラスの再宣言を次の例に示します。
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary
' This violates the rule.
<ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _
Public Class DualInterface
Public Sub SomeSub
End Sub
End Class
Public Interface IExplicitInterface
Sub SomeSub
End Interface
<ClassInterfaceAttribute(ClassInterfaceType.None)> _
Public Class ExplicitInterface
Implements IExplicitInterface
Public Sub SomeSub Implements IExplicitInterface.SomeSub
End Sub
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
// This violates the rule.
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DualInterface
{
public void SomeMethod() {}
}
public interface IExplicitInterface
{
void SomeMethod();
}
[ClassInterface(ClassInterfaceType.None)]
public class ExplicitInterface : IExplicitInterface
{
public void SomeMethod() {}
}
}
関連規則
CA1403: Auto 配置の型を COM 参照可能にすることはできません
CA1412: ComSource インターフェイスを IDispatch として設定します