Partager via


Éviter les surcharges dans les interfaces visibles par COM

Mise à jour : novembre 2007

TypeName

AvoidOverloadsInComVisibleInterfaces

CheckId

CA1402

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Une interface visible par COM déclare des méthodes surchargées.

Description de la règle

Lorsque les méthodes surchargées sont exposées aux clients COM, seule la première surcharge de méthode conserve son nom. Les surcharges suivantes sont renommées de manière unique par l'ajout d'un trait de soulignement '_' au nom et d'un entier qui correspond à l'ordre de déclaration de la surcharge. Prenons par exemple les méthodes suivantes :

   void SomeMethod(int valueOne);
   void SomeMethod(int valueOne, int valueTwo, int valueThree);
   void SomeMethod(int valueOne, int valueTwo);

Ces méthodes sont exposées aux clients COM comme suit :

   void SomeMethod(int valueOne);
   void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
   void SomeMethod_3(int valueOne, int valueTwo);

Les clients COM Visual Basic 6 ne peuvent pas implémenter de méthodes d'interface avec un trait de soulignement dans le nom.

Comment corriger les violations

Pour corriger une violation de cette règle, renommez les méthodes surchargées afin que les noms soient uniques. Vous pouvez aussi rendre l'interface invisible à COM en remplaçant l'accessibilité par internal (Friend en Visual Basic) ou en appliquant l'ensemble d'attributs System.Runtime.InteropServices.ComVisibleAttribute à false.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant présente une interface qui enfreint la règle et une autre qui satisfait la règle.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   ' This interface violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Interface IOverloadedInterface

      Sub SomeSub(valueOne As Integer)
      Sub SomeSub(valueOne As Integer, valueTwo As Integer)

   End Interface

   ' This interface satisfies the rule.
   <ComVisibleAttribute(True)> _ 
   Public Interface INotOverloadedInterface

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

   End Interface

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

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   // This interface violates the rule.
   [ComVisible(true)]
   public interface IOverloadedInterface
   {
      void SomeMethod(int valueOne);
      void SomeMethod(int valueOne, int valueTwo);
   }

   // This interface satisfies the rule.
   [ComVisible(true)]
   public interface INotOverloadedInterface
   {
      void SomeMethod(int valueOne);
      void AnotherMethod(int valueOne, int valueTwo);
   }
}

Règles connexes

Éviter les champs non publics dans les types valeur visibles par COM

Éviter les membres statiques dans les types visibles par COM

Marquer les assemblys avec ComVisibleAttribute

Voir aussi

Référence

Long, type de données (Visual Basic)

Autres ressources

Interopération avec du code non managé