Partilhar via


CA1402: evitar sobrecargas em interfaces visíveis COM

TypeName

AvoidOverloadsInComVisibleInterfaces

CheckId

CA1402

Categoria

Microsoft.Interoperability

Alteração Significativa

Quebra

Causa

Uma interface visível do Component Object Model (COM) declara métodos sobrecarregados.

Descrição da Regra

Quando os métodos sobrecarregados são expostos para clientes COM, apenas a primeira sobrecarga do método retém seu nome.As sobrecargas subsequentes são renomeadas exclusivamente acrescentando-se ao nome um caractere de sublinhado “_” e um inteiro que corresponde à ordem de declaração de sobrecarga.Por exemplo, considere os seguintes métodos.

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

Esses métodos são expostos para clientes COM com o seguinte.

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

Os clientes do Visual Basic 6 COM não podem implementar métodos da interface usando um sublinhado no nome.

Como Corrigir Violações

Para corrigir uma violação desta regra, renomeie os métodos sobrecarregados de forma que os nomes são exclusivos.Como alternativa, crie a interface invisível COM a alteração da acessibilidade a internal (Friend em Visual Basic) ou aplicando o atributo de ComVisibleAttribute definido como false.

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra uma interface que viola a regra e uma interface que satisfaça a regra.

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

Regras Relacionadas

CA1413: evitar campos não públicos em tipos de valor visíveis COM

CA1407: evitar membros estáticos em tipos visíveis COM

CA1017: marcar assemblies com ComVisibleAttribute

Consulte também

Referência

Tipo de dados Long (Visual Basic)

Outros recursos

Interoperação com código não gerenciado