次の方法で共有


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 として設定します

参照

概念

クラス インターフェイスの概要

相互運用のための .NET 型の要件

その他の技術情報

アンマネージ コードとの相互運用