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 |
Sí |
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)