CA1412: ComSource インターフェイスを IDispatch として設定します

TypeName

MarkComSourceInterfacesAsIDispatch

CheckId

CA1412

カテゴリ

Microsoft.Interoperability

互換性に影響する変更点

あり

原因

型が ComSourceInterfacesAttribute 属性によってマークされていますが、1 つ以上の指定されたインターフェイスが InterfaceIsDispatch 値に設定された InterfaceTypeAttribute 属性によってマークされていません。

規則の説明

ComSourceInterfacesAttribute は、クラスがコンポーネント オブジェクト モデル (COM: Component Object Model) クライアントに公開するイベント インターフェイスを識別するために使用されます。 Visual Basic 6 COM クライアントがイベント通知を受信できるように、これらのインターフェイスは InterfaceIsIDispatch として公開する必要があります。 既定では、インターフェイスが InterfaceTypeAttribute 属性によってマークされていない場合、デュアル インターフェイスとして公開されます。

違反の修正方法

この規則の違反を修正するには、InterfaceTypeAttribute 属性を追加または変更して、ComSourceInterfacesAttribute 属性によって指定されたすべてのインターフェイスに対して、値が InterfaceIsIDispatch に設定されるようにします。

警告を抑制する状況

この規則による警告は抑制しないでください。

使用例

インターフェイスの 1 つがこの規則に違反しているクラスを次の例に示します。

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 シンクによって処理されるイベントを発生させる

その他の技術情報

アンマネージ コードとの相互運用