Compartir a través de


Marque las interfaces de ComSource como IDispatch

Actualización: noviembre 2007

     TypeName

MarkComSourceInterfacesAsIDispatch

Identificador de comprobación

CA1412

Category

Microsoft.Interoperability

Cambio problemático

Motivo

Un tipo está marcado con el atributo System.Runtime.InteropServices.ComSourceInterfacesAttribute y al menos una de las interfaces especificadas no está marcada con el atributo System.Runtime.InteropServices.InterfaceTypeAttribute establecido en ComInterfaceType.InterfaceIsIDispatch.

Descripción de la regla

ComSourceInterfacesAttribute se utiliza para identificar las interfaces de eventos que una clase expone a los clientes COM. Estas interfaces se deben exponer como InterfaceIsIDispatch para permitir que los clientes COM de Visual Basic 6 reciban las notificaciones de eventos. De forma predeterminada, si una interfaz no está marcada con el atributo InterfaceTypeAttribute, se expone como una interfaz dual.

Cómo corregir infracciones

Para corregir una infracción de esta regla, agregue o modifique el atributo InterfaceTypeAttribute de modo que su valor esté establecido en InterfaceIsIDispatch para todas las interfaces especificadas con el atributo ComSourceInterfacesAttribute.

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

En el ejemplo siguiente se muestra una clase donde una de las interfaces infringe la regla.

Imports Microsoft.VisualBasic
Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary

   ' This violates the rule for type EventSource.
   <InterfaceType(ComInterfaceType.InterfaceIsDual)> _ 
   Public Interface IEventsInterface
      Sub EventOne
      Sub EventTwo
   End Interface

   ' This satisfies the rule.
   <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _ 
   Public Interface IMoreEventsInterface
      Sub EventThree
      Sub EventFour
   End Interface

   <ComSourceInterfaces( _
      "InteroperabilityLibrary.IEventsInterface" & _ 
      ControlChars.NullChar & _ 
      "InteroperabilityLibrary.IMoreEventsInterface")> _
   Public Class EventSource
      ' Event and method declarations.
   End Class

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

[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
   // This violates the rule for type EventSource.
   [InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IEventsInterface
   {
      void EventOne();
      void EventTwo();
   }

   // This satisfies the rule.
   [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
   public interface IMoreEventsInterface
   {
      void EventThree();
      void EventFour();
   }

   [ComSourceInterfaces(
      "InteroperabilityLibrary.IEventsInterface\0" + 
      "InteroperabilityLibrary.IMoreEventsInterface")]
   public class EventSource
   {
      // Event and method declarations.
   }
}

Reglas relacionadas

No utilice AutoDual ClassInterfaceType

Vea también

Tareas

Cómo: Generar eventos controlados por un receptor COM

Otros recursos

Interoperar con código no administrado