Compartir a través de


CA1405: Los tipos base de tipos visibles para COM deben ser visibles para COM

Nombre de tipo

ComVisibleTypeBaseTypesShouldBeComVisible

Identificador de comprobación

CA1405

Categoría

Microsoft.Interoperability

Cambio problemático

Depende de la corrección

Causa

Un tipo visible para el Modelo de objetos componentes (COM) deriva de un tipo que no es visible para COM.

Descripción de la regla

Cuando un tipo visible a través de COM agrega miembros en una nueva versión, debe cumplir una serie de instrucciones estrictas a fin de evitar la interrupción de los clientes COM enlazados a la versión actual. Un tipo que es no visible a través de COM da por hecho que no necesita cumplir estas reglas de administración de versiones de COM al agregar nuevos miembros. Sin embargo, si un tipo visible a través de COM se deriva del tipo no visible a través de COM y expone una interfaz de clases de ClassInterfaceType.AutoDual o AutoDispatch (valor predeterminado), todos los miembros públicos del tipo base (a no ser que estén marcados de manera específica como del tipo no visible a través de COM, lo que sería redundante) están expuestos a COM. Si el tipo base agrega nuevos miembros en una versión subsiguiente, todos los clientes COM que se enlacen a la interfaz de clases del tipo derivado podrían interrumpirse. Los tipos visibles a través de COM se deben derivar únicamente de tipos visibles a través de COM para reducir la posibilidad de interrumpir los clientes COM.

Cómo corregir infracciones

Para corregir una infracción de esta regla, haga que los tipos base sean visibles a través de COM o que el tipo derivado sea no visible a través de COM.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe la regla.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   <ComVisibleAttribute(False)> _ 
   Public Class BaseClass

      Sub SomeSub(valueOne As Integer)
      End Sub

   End Class

   ' This class violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Class DerivedClass
      Inherits BaseClass

      Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
      End Sub

   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(false)]
   public class BaseClass
   {
      public void SomeMethod(int valueOne) {}
   }

   // This class violates the rule.
   [ComVisible(true)]
   public class DerivedClass : BaseClass
   {
      public void AnotherMethod(int valueOne, int valueTwo) {}
   }
}

Vea también

Referencia

System.Runtime.InteropServices.ClassInterfaceAttribute

Conceptos

Presentar la interfaz de clase

Otros recursos

Interoperar con código no administrado