Partager via


CA1412 : Marquer les interfaces ComSource comme IDispatch

TypeName

MarkComSourceInterfacesAsIDispatch

CheckId

CA1412

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Un type est marqué avec l'attribut ComSourceInterfacesAttribute et au moins une interface spécifiée n'est pas marquée avec l'attribut InterfaceTypeAttribute ayant la valeur InterfaceIsDispatch.

Description de la règle

ComSourceInterfacesAttribute est utilisé pour identifier les interfaces d'événements qu'une classe expose aux clients COM (Component Object Model). 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

CA1408 : Ne pas utiliser le paramètre 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é