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


CA1408: не используйте AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Категория

Microsoft.Interoperability

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

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

Причина

Видимый для COM тип значения помечен атрибутом ClassInterfaceAttribute, у которого для AutoDual установлено значение ClassInterfaceType.

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

Типы, использующие сдвоенный интерфейс, позволяют клиентам выполнять привязку к определенному макету интерфейса.Все изменения в будущей версии макета типа и в базовых типах приведут к нарушению работы COM-клиентов, связанных с интерфейсом.По умолчанию, если атрибут ClassInterfaceAttribute не указан, используется только диспетчерский интерфейс.

Если не указано иное, все открытые и не универсальные типы являются видимыми для COM; все не открытые и универсальные типы являются невидимыми для COM.

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

Чтобы устранить нарушение этого правила, измените значение атрибута ClassInterfaceAttribute на None типа ClassInterfaceType и явным образом определите интерфейс.

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

Не отключайте предупреждения этого правила, если вы не уверены, что макет типа и его базовые типы останутся неизменными в последующей версии.

Пример

В следующем примере показан класс, нарушающий это правило, и повторное объявление класса с использованием явного интерфейса.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary

   ' This violates the rule.
   <ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _ 
   Public Class DualInterface
      Public Sub SomeSub
      End Sub
   End Class

   Public Interface IExplicitInterface
      Sub SomeSub
   End Interface

   <ClassInterfaceAttribute(ClassInterfaceType.None)> _ 
   Public Class ExplicitInterface
      Implements IExplicitInterface

      Public Sub SomeSub Implements IExplicitInterface.SomeSub
      End Sub

   End Class

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

[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
   // This violates the rule.
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class DualInterface
   {
      public void SomeMethod() {}
   }

   public interface IExplicitInterface
   {
      void SomeMethod();
   }

   [ClassInterface(ClassInterfaceType.None)]
   public class ExplicitInterface : IExplicitInterface
   {
      public void SomeMethod() {}
   }
}

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

CA1403: типы макета Auto не должны быть видимыми для COM

CA1412: помечайте интерфейсы ComSource как IDispatch

См. также

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

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

Уточнение типов .NET для взаимодействия

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

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