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