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é