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