Partager via


CA1408 : Ne pas utiliser le paramètre AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Un type COM (Component Object Model) visible est marqué avec l'attribut ClassInterfaceAttribute défini sur la valeur AutoDual de ClassInterfaceType.

Description de la règle

Les types qui utilisent une interface double permettent aux clients de se lier à une disposition d'interface spécifique.Les modifications apportées à une version future de la disposition du type ou des types de base bloquent les clients COM qui se lient à l'interface.Par défaut, si l'attribut ClassInterfaceAttribute n'est pas spécifié, une interface de répartition uniquement est utilisée.

Sauf s'ils sont marqués autrement, tous les types publics et non génériques sont visibles dans COM ; tous les types non publics et génériques ne sont pas visibles dans COM.

Comment corriger les violations

Pour corriger une violation de cette règle, remplacez la valeur de l'attribut ClassInterfaceAttribute par la valeur None de ClassInterfaceType et définissez explicitement l'interface.

Quand supprimer les avertissements

Ne supprimez pas d'avertissement de cette règle sauf s'il est certain que la disposition du type et de ses types de base ne change pas dans une version future.

Exemple

L'exemple suivant présente une classe qui ne respecte pas la règle et une nouvelle déclaration de la classe pour utiliser une interface explicite.

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() {}
   }
}

Règles connexes

CA1403 : Les types Structurer automatiquement ne doivent pas être visibles par COM

CA1412 : Marquer les interfaces ComSource comme IDispatch

Voir aussi

Concepts

Présentation de l'interface de classe

Qualification des types .NET en vue d'une interopérabilité

Autres ressources

Interopération avec du code non managé