Partager via


Marquer les interfaces ComSource comme IDispatch

Mise à jour : novembre 2007

TypeName

MarkComSourceInterfacesAsIDispatch

CheckId

CA1412

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Un type est marqué avec l'attribut System.Runtime.InteropServices.ComSourceInterfacesAttribute et au moins une des interfaces spécifiées n'est pas marquée avec l'attribut System.Runtime.InteropServices.InterfaceTypeAttribute ayant la valeur ComInterfaceType.InterfaceIsIDispatch.

Description de la règle

ComSourceInterfacesAttribute est utilisé pour identifier les interfaces d'événement qu'une classe expose aux clients COM. Ces interfaces doivent être exposées comme InterfaceIsIDispatch pour permettre aux clients COM Visual Basic 6 de recevoir les notifications d'événement. Par défaut, si une interface n'est pas marquée avec l'attribut InterfaceTypeAttribute, elle est exposée comme une interface double.

Comment corriger les violations

Pour corriger une violation de cette règle, ajoutez ou modifiez l'attribut InterfaceTypeAttribute afin que sa valeur soit InterfaceIsIDispatch pour toutes les interfaces spécifiées avec l'attribut ComSourceInterfacesAttribute.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant montre une classe où l'une des interfaces enfreint la règle.

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.
   }
}

Règles connexes

Ne pas utiliser AutoDual ClassInterfaceType

Voir aussi

Tâches

Comment : déclencher des événements gérés par un récepteur COM

Autres ressources

Interopération avec du code non managé