CA1408: No utilizar AutoDual ClassInterfaceType
Nombre de tipo |
DoNotUseAutoDualClassInterfaceType |
Identificador de comprobación |
CA1408 |
Categoría |
Microsoft.Interoperability |
Cambio problemático |
Sí |
Causa
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