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


Не используйте AutoDual ClassInterfaceType

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

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Категория

Microsoft.Interoperability

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

Критическое

Причина

Видимый тип COM помечен атрибутом System.Runtime.InteropServices.ClassInterfaceAttribute, равным ClassInterfaceType.AutoDual.

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

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

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

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

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

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

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

Пример

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

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() {}
   }
}

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

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

Помечать интерфейсы ComSource как IDispatch

См. также

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

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

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

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

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