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