Compartilhar via


CA1408: não usar AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Categoria

Microsoft.Interoperability

Alteração Significativa

Quebra

Causa

Um tipo visível do Component Object Model (COM) é marcado com atributo definido de ClassInterfaceAttribute ao valor de AutoDual de ClassInterfaceType.

Descrição da Regra

Tipos que usa uma interface dupla permite que clientes para associar a um layout específico da interface.Todas as modificações em uma versão futura ao layout do tipo ou de qualquer tipo de base do travará clientes COM que são associados à interface.Por padrão, se o atributo de ClassInterfaceAttribute não for especificado, uma interface de expedição somente é usada.

A menos que marcados de outra forma, todos os tipos públicos não são visíveis à; todos os tipos genéricos público e são invisíveis COM.

Como Corrigir Violações

Para corrigir uma violação desta regra, altere o valor do atributo de ClassInterfaceAttribute ao valor de None de ClassInterfaceType e defina explicitamente a interface.

Quando Suprimir Alertas

Não suprima um aviso desta regra a menos que seja absolutamente certeza de que o layout do tipo e seus tipos de base não será alterado em uma versão futura.

Exemplo

O exemplo a seguir mostra uma classe que viola a regra e novamente uma declaração de 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: os tipos de layout automático não devem ser visíveis em COM

CA1412: marcar interfaces ComSource como IDispatch

Consulte também

Conceitos

Introdução à interface de classe

Qualificando tipos do .NET para interoperação

Outros recursos

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