Compartir a través de


Los tipos base visibles para COM deben ser COMVisible

Actualización: noviembre 2007

     TypeName

ComVisibleTypeBaseTypesShouldBeComVisible

Identificador de comprobación

CA1405

Category

Microsoft.Interoperability

Cambio problemático

Depende de la corrección

Motivo

Un tipo visible a través de COM se deriva de un tipo no visible a través de 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

Conceptos

Presentar la interfaz de clase

Referencia

System.Runtime.InteropServices.ClassInterfaceAttribute

Otros recursos

Interoperar con código no administrado