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


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

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) или присвоив атрибуту 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);
   }
}

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

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

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

CA1017: помечайте сборки атрибутом ComVisibleAttribute

См. также

Ссылки

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

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

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