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