CA1402: COM 参照可能インターフェイスでのオーバーロードを避けてください
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
CA1402 |
カテゴリ |
Microsoft.Interoperability |
互換性に影響する変更点 |
あり |
原因
コンポーネント オブジェクト モデル (COM: Component Object Model) から参照できるインターフェイスが、オーバーロードされたメソッドを宣言しています。
規則の説明
オーバーロードされたメソッドが COM クライアントに公開されると、最初のメソッド オーバーロードだけが名前を保持します。 後続のオーバーロードは、名前にアンダースコア文字 '_' およびオーバーロードの宣言の順序に対応する整数が付加され、一意の名前に変更されます。 次にメソッドの例を示します。
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo, int valueThree);
void SomeMethod(int valueOne, int valueTwo);
これらのメソッドは、次のように COM クライアントに公開されます。
void SomeMethod(int valueOne);
void SomeMethod_2(int valueOne, int valueTwo, int valueThree);
void SomeMethod_3(int valueOne, int valueTwo);
Visual Basic 6 COM クライアントは、名前にアンダースコアを含むインターフェイス メソッドを実装できません。
違反の修正方法
この規則の違反を修正するには、名前が一意になるようにオーバーロードされたメソッドの名前を変更します。 または、COM からインターフェイスを参照できるようにするために、internal (Visual Basic では Friend) を変更するか、false に設定した System.Runtime.InteropServices.ComVisibleAttribute 属性を適用します。
警告を抑制する状況
この規則による警告は抑制しないでください。
使用例
この規則に違反しているインターフェイスと、規則に適合するインターフェイスを次の例に示します。
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
' This interface violates the rule.
<ComVisibleAttribute(True)> _
Public Interface IOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub SomeSub(valueOne As Integer, valueTwo As Integer)
End Interface
' This interface satisfies the rule.
<ComVisibleAttribute(True)> _
Public Interface INotOverloadedInterface
Sub SomeSub(valueOne As Integer)
Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
End Interface
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
// This interface violates the rule.
[ComVisible(true)]
public interface IOverloadedInterface
{
void SomeMethod(int valueOne);
void SomeMethod(int valueOne, int valueTwo);
}
// This interface satisfies the rule.
[ComVisible(true)]
public interface INotOverloadedInterface
{
void SomeMethod(int valueOne);
void AnotherMethod(int valueOne, int valueTwo);
}
}
関連規則
CA1413: Com 参照可能な値型ではパブリックでないフィールドを使用しません
CA1407: Com 参照可能な型で静的メンバーを使用しません
CA1017: アセンブリに ComVisibleAttribute を設定します