CA1412: помечайте интерфейсы ComSource как IDispatch
TypeName |
MarkComSourceInterfacesAsIDispatch |
CheckId |
CA1412 |
Категория |
Microsoft.Interoperability |
Критическое изменение |
Критическое изменение |
Причина
Тип помечен атрибутом ComSourceInterfacesAttribute и как минимум один из указанных интерфейсов не помечен атрибутом InterfaceTypeAttribute со значением InterfaceIsDispatch.
Описание правила
ComSourceInterfacesAttribute используется для идентификации интерфейсов событий, предоставляемых классом для клиентов COM.Чтобы клиенты COM Visual Basic 6 могли получать уведомления о событиях, эти интерфейсы должны быть представлены в виде InterfaceIsIDispatch.По умолчанию интерфейс, не помеченный с помощью атрибута InterfaceTypeAttribute, выводится как двойной интерфейс.
Устранение нарушений
Чтобы устранить нарушение данного правила, добавьте или измените атрибут InterfaceTypeAttribute так, чтобы в качестве его значения было задано InterfaceIsIDispatch для всех интерфейсов, заданных с атрибутом ComSourceInterfacesAttribute.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример
В следующем примере показан класс, в котором один из интерфейсов нарушает правило.
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.
}
}
Связанные правила
CA1408: не используйте AutoDual ClassInterfaceType
См. также
Задачи
Практическое руководство. Вызов событий, обрабатываемых приемником COM