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