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 для взаимодействия