Поделиться через


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

Другие ресурсы

Взаимодействие с неуправляемым кодом