Não use AutoDual ClassInterfaceType
TypeName |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
Category (Categoria) |
Microsoft.interoperabilidade |
Quebrando alterar |
Quebrando |
Causa
Um tipo visível COM é marcado com o System.Runtime.InteropServices.ClassInterfaceAttribute atributo conjunto para ClassInterfaceType.AutoDual.
Descrição da regra
Tipos que usam uma interface dupla permitem que os clientes BIND a um layout de interface específica.Quaisquer alterações em uma versão futura ao layout do tipo ou quaisquer tipos base interromperá COM clientes que ligam à interface.Por padrão, se o ClassInterfaceAttribute atributo não for especificado, uma interface de despacho somente será usada.
A menos que marcado caso contrário, todos os tipos não genéricos públicos são visíveis para com.; todos os tipos genéricos e não-públicos são invisível para COM.
Como corrigir violações
Para corrigir uma violação dessa regra alterar o valor do ClassInterfaceAttribute atributo à None e definir explicitamente a interface.
Quando suprimir avisos
Elimina um aviso da regra, a menos que seja determinado que o layout de 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 um re-declaração 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
Tipos de layout automático não devem ser visível com.
Marcar ComSource interfaces sistema autônomo IDispatch
Consulte também
Conceitos
Apresentando a interface de classe
Qualificação tipos .NET para interoperação