Compartilhar via


CA1408: Não use ClassInterfaceType de AutoDual

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Quebrando

Causa

Um tipo de modelo de objeto componente (COM) visível é marcado com o ClassInterfaceAttribute atributo definido como o AutoDual o valor de ClassInterfaceType.

Descrição da regra

Tipos de uma interface dupla habilitam clientes vincular a um layout de interface específica. Quaisquer alterações em uma versão futura do layout do tipo ou quaisquer tipos base interromperá os clientes COM que vincule à interface. Por padrão, se a ClassInterfaceAttribute atributo não for especificado, uma interface somente de distribuição é usada.

A menos que o marcado caso contrário, todos os tipos de não genérico públicos são visíveis COM; todos os tipos de confidenciais e genéricos são invisíveis para COM.

Como corrigir violações

Para corrigir uma violação desta regra, altere o valor da ClassInterfaceAttribute de atributo para o None valor de ClassInterfaceType e definir explicitamente a interface.

Quando suprimir avisos

Não suprimir um aviso de que essa regra é certo de que o layout do tipo e seus tipos base não será alterada em uma versão futura.

Exemplo

O exemplo a seguir mostra uma classe que viola a regra e uma re-declaration da classe para usar uma interface explícita.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary

   ' This violates the rule.
   <ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _ 
   Public Class DualInterface
      Public Sub SomeSub
      End Sub
   End Class

   Public Interface IExplicitInterface
      Sub SomeSub
   End Interface

   <ClassInterfaceAttribute(ClassInterfaceType.None)> _ 
   Public Class ExplicitInterface
      Implements IExplicitInterface

      Public Sub SomeSub Implements IExplicitInterface.SomeSub
      End Sub

   End Class

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

[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
   // This violates the rule.
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class DualInterface
   {
      public void SomeMethod() {}
   }

   public interface IExplicitInterface
   {
      void SomeMethod();
   }

   [ClassInterface(ClassInterfaceType.None)]
   public class ExplicitInterface : IExplicitInterface
   {
      public void SomeMethod() {}
   }
}

Regras relacionadas

CA1403: Tipos de layout automático não devem ser visível em COM

CA1412: Interfaces de marca ComSource como IDispatch

Consulte também

Conceitos

Apresentando a Interface de classe

Qualificação.NET tipos de interoperação

Outros recursos

Interoperação com Código Não Gerenciado