CA1402:避免在 COM 可见接口中进行重载

类型名

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);
   }
}

相关规则

CA1413:避免在 COM 可见值类型中使用非公共字段

CA1407:避免在 COM 可见类型中使用静态成员

CA1017:用 ComVisibleAttribute 标记程序集

请参见

参考

Long 数据类型 (Visual Basic)

其他资源

与非托管代码交互操作