CA1408: No utilizar AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

Identificador de comprobación

CA1408

Categoría

Microsoft.Interoperability

Cambio problemático

Problemático

Motivo

Un tipo visible para el Modelo de objetos componentes (COM) está marcado con el atributo ClassInterfaceAttribute establecido en el valor AutoDual de ClassInterfaceType.

Descripción de la regla

Los tipos que utilizan una interfaz dual permiten a los clientes enlazarse a un diseño de interfaz concreto.Cualquier cambio que se introduzca en una versión futura en el diseño del tipo o en cualquier tipo base provocará un error en los clientes COM que están enlazados a la interfaz.De forma predeterminada, si no se especifica el atributo ClassInterfaceAttribute, se utiliza una interfaz sólo de envío.

A menos que se marque lo contrario, todos los tipos públicos no genéricos son visibles para COM; todos los tipos no públicos y genéricos son invisibles para COM.

Cómo corregir infracciones

Para corregir una infracción de esta regla, cambie el valor del atributo ClassInterfaceAttribute al valor None de ClassInterfaceType y defina la interfaz de manera explícita.

Cuándo suprimir advertencias

No suprima ninguna advertencia de esta regla a no ser que esté absolutamente seguro de que el diseño del tipo y sus tipos base no van a cambiar en una versión posterior.

Ejemplo

El ejemplo siguiente muestra una clase que infringe la regla y una nueva declaración de la clase de modo que utilice una interfaz 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() {}
   }
}

Reglas relacionadas

CA1403: Los tipos de diseño automático no deben ser visibles para COM

CA1412: Marcar las interfaces ComSource como IDispatch

Vea también

Conceptos

Presentar la interfaz de clase

Habilitar tipos de .NET para la interoperación

Otros recursos

Interoperar con código no administrado