更新:2007 年 11 月
TypeName |
AvoidOverloadsInComVisibleInterfaces |
CheckId |
CA1402 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
是 |
原因
COM 可见的接口声明重载的方法。
规则说明
在向 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);
}
}