Condividi tramite


CA1402: Evitare gli overload nelle interfacce visibili a COM

TypeName

AvoidOverloadsInComVisibleInterfaces

CheckId

CA1402

Category

Microsoft.Interoperability

Breaking Change

Breaking

Causa

Un'interfaccia visibile di COM (Component Object Model) dichiara i metodi sottoposti a overload.

Descrizione della regola

Quando i metodi sottoposti a overload vengono esposti ai client COM, solo il primo overload di metodo conserva il proprio nome. Gli overload successivi vengono rinominati in maniera univoca aggiungendo al nome un carattere di sottolineatura '_' e un intero che corrisponde all'ordine di dichiarazione dell'overload. Si considerino ad esempio i metodi seguenti.

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

Questi metodi sono esposti ai client COM analoghi al seguente.

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

I client COM Visual Basic 6 non sono in grado di implementare i metodi di interfaccia mediante un carattere di sottolineatura nel nome.

Come correggere le violazioni

Per correggere una violazione di questa regola, rinominare i metodi sottoposti a overload in modo che i nomi risultino univoci. In alternativa, rendere l'interfaccia invisibile a COM modificando l'accessibilità in internal (Friend in Visual Basic) oppure applicando l'attributo System.Runtime.InteropServices.ComVisibleAttribute impostato su false.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito vengono illustrate un'interfaccia che viola la regola e una che la soddisfa.

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);
   }
}

Regole correlate

CA1413: Evitare i campi non pubblici nei tipi valore visibili a COM

CA1407: Evitare i membri statici nei tipi visibili a COM

CA1017: Contrassegnare gli assembly con ComVisibleAttribute

Vedere anche

Riferimenti

Tipo di dati Long (Visual Basic)

Altre risorse

Interoperabilità con codice non gestito