Compartir a través de


No utilice AutoDual ClassInterfaceType

Actualización: noviembre 2007

     TypeName

DoNotUseAutoDualClassInterfaceType

Identificador de comprobación

CA1408

Category

Microsoft.Interoperability

Cambio problemático

Motivo

Un tipo visible para COM está marcado con el atributo System.Runtime.InteropServices.ClassInterfaceAttribute establecido en ClassInterfaceType.AutoDual.

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 a None 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

Los tipos de diseño automático no deben ser COMVisible

Marque las interfaces de 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