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