Поделиться через


Не используйте перегрузки в интерфейсах, видимых в COM

Обновлен: Ноябрь 2007

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

Клиенты COM Visual Basic 6 не могут реализовывать методы интерфейса с символом подчеркивания в имени.

Устранение нарушений

Чтобы устранить нарушение этого правила, переименуйте перегруженные методы так, чтобы имена были уникальными. Второй вариант: сделайте интерфейсы невидимыми для COM, изменив их доступность на internal (Friend в Visual Basic) или присвоив атрибуту System.Runtime.InteropServices.ComVisibleAttribute значение false.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере демонстрируется интерфейс, нарушающий описанное правило, а также интерфейс, выполняющий его.

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

Связанные правила

Избегать использования не открытых полей в типах значений, видимых в COM

Не используйте статические члены в видимых COM типах

Помечайте сборки атрибутом ComVisibleAttribute

См. также

Ссылки

Тип данных Long (Visual Basic)

Другие ресурсы

Взаимодействие с неуправляемым кодом