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


CA1405: базовые типы, относящиеся к типу видимых COM-клиенту, должны быть видимыми для COM

TypeName

ComVisibleTypeBaseTypesShouldBeComVisible

CheckId

CA1405

Категория

Microsoft.Interoperability

Критическое изменение

DependsOnFix

Причина

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

Описание правила

Если тип, видимый для COM, добавляет члены в новую версию, то, чтобы не нарушить работу COM-клиентов, связанных с текущей версией, необходимо строго следовать определенным правилам.Для типов, невидимых для COM, следование правилам управления версиями COM при добавлении новых членов не требуется.Однако, если видимый для COM тип наследует от невидимого для COM типа и предоставляет интерфейс класса ClassInterfaceType.AutoDual или AutoDispatch (по умолчанию), все открытые члены базового типа (если только они не помечены как невидимые для COM, что было бы избыточным) предоставляются клиентам COM.Если базовый тип добавляет новые члены в последующую версию, работа всех клиентов COM, связанных с интерфейсом класса производного типа, может быть нарушена.Чтобы снизить вероятность нарушения работы COM-клиентов, видимые для COM типы должны наследовать только от видимых для COM типов.

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

Чтобы устранить нарушение данного правила, сделайте базовые типы видимыми для COM или производный тип невидимым для COM.

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

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

Пример

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

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   <ComVisibleAttribute(False)> _ 
   Public Class BaseClass

      Sub SomeSub(valueOne As Integer)
      End Sub 

   End Class 

   ' This class violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Class DerivedClass
      Inherits BaseClass

      Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
      End Sub 

   End Class 

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(false)]
   public class BaseClass
   {
      public void SomeMethod(int valueOne) {}
   }

   // This class violates the rule.
   [ComVisible(true)]
   public class DerivedClass : BaseClass
   {
      public void AnotherMethod(int valueOne, int valueTwo) {}
   }
}

См. также

Ссылки

ClassInterfaceAttribute

Основные понятия

Введение в интерфейс класса

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

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