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