Compartir a través de


Evitar las sobrecargas en las interfaces de ComVisible

Actualización: noviembre 2007

     TypeName

AvoidOverloadsInComVisibleInterfaces

Identificador de comprobación

CA1402

Category

Microsoft.Interoperability

Cambio problemático

Motivo

Una interfaz visible para COM declara métodos sobrecargados.

Descripción de la regla

Cuando se exponen métodos sobrecargados a los clientes COM, sólo la primera sobrecarga de método conserva su nombre. Las sobrecargas subsiguientes reciben un nombre único resultante de anexar al nombre un carácter de subrayado ('_') y un entero correspondiente al orden de declaración de la sobrecarga. Por ejemplo, considere los siguientes métodos:

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

Estos métodos se exponen a los clientes COM como:

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

Los clientes COM de Visual Basic 6 no pueden implementar métodos de interfaz que tengan un carácter de subrayado en el nombre.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el nombre de los métodos sobrecargados de modo que sus nombres sean únicos. Como alternativa, puede hacer que la interfaz sea invisible para COM cambiando la accesibilidad a internal (Friend en Visual Basic) o aplicando el atributo System.Runtime.InteropServices.ComVisibleAttribute establecido en false.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El ejemplo siguiente muestra una interfaz que infringe la regla y otra que la cumple.

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

Reglas relacionadas

Evitar los campos no públicos en los tipos de valor de ComVisible

Evitar miembros estáticos en tipos visibles para COM

Marcar los ensamblados con ComVisibleAttribute

Vea también

Referencia

Long (Tipo de datos, Visual Basic)

Otros recursos

Interoperar con código no administrado