CA1408: Não use AutoDual ClassInterfaceType
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 valor de ClassInterfaceType.
Descrição da regra
Tipos que utilizam uma interface dual permitem que clientes vincular a um layout de interface específica.Qualquer alteração em uma versão futura no layout do tipo ou quaisquer tipos base interromperá os clientes COM que se vinculam à interface.Por padrão, se a ClassInterfaceAttribute atributo não for especificado, é usada uma interface somente de distribuição.
A menos que marcados caso contrário, todos os tipos não genérico públicos são visíveis para 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 da regra, exceto se for determinado 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