Partager via


Les types de base type visibles par COM doivent être visibles par COM

Mise à jour : novembre 2007

TypeName

ComVisibleTypeBaseTypesShouldBeComVisible

CheckId

CA1405

Catégorie

Microsoft.Interoperability

Modification avec rupture

DependsOnFix

Cause

Un type visible par COM dérive d'un type qui n'est pas visible par COM.

Description de la règle

Lorsqu'un type visible par COM ajoute des membres dans une nouvelle version, il doit se conformer strictement aux instructions pour éviter de bloquer des clients COM qui se lient à la version actuelle. Un type qui est invisible dans COM suppose qu'il n'a pas besoin de respecter ces règles de versioning COM lorsqu'il ajoute de nouveaux membres. Toutefois, si un type visible par COM dérive du type invisible par COM et expose une interface de classe de ClassInterfaceType.AutoDual ou AutoDispatch (valeur par défaut), tous les membres publics du type de base (sauf s'ils sont marqués spécifiquement comme étant invisibles par COM, auquel cas, ils sont redondants) sont exposés dans COM. Si le type de base ajoute de nouveaux membres dans une version suivante, les clients COM qui se lient à l'interface de classe du type dérivé peuvent être bloqués. Les types visibles par COM doivent dériver uniquement de types visibles par COM pour éviter toute possibilité de blocage des clients COM.

Comment corriger les violations

Pour corriger une violation de cette règle, faites en sorte que les types de base soient visibles par COM ou que le type dérivé soit invisible par COM.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant affiche un type qui enfreint la règle.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   <ComVisibleAttribute(False)> _ 
   Public Class BaseClass

      Sub SomeSub(valueOne As Integer)
      End Sub

   End Class

   ' This class violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Class DerivedClass
      Inherits BaseClass

      Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
      End Sub

   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(false)]
   public class BaseClass
   {
      public void SomeMethod(int valueOne) {}
   }

   // This class violates the rule.
   [ComVisible(true)]
   public class DerivedClass : BaseClass
   {
      public void AnotherMethod(int valueOne, int valueTwo) {}
   }
}

Voir aussi

Concepts

Présentation de l'interface de classe

Référence

System.Runtime.InteropServices.ClassInterfaceAttribute

Autres ressources

Interopération avec du code non managé