Share via


CA1405:COM 可见类型的基类型应对 COM 可见

类型名

ComVisibleTypeBaseTypesShouldBeComVisible

CheckId

CA1405

类别

Microsoft.Interoperability

是否重大更改

DependsOnFix

原因

从非 COM 可见的类型派生的组件对象模型 (COM) 可见的类型。

规则说明

当 COM 可见类型在新版本中添加成员时,必须遵循严格的准则,以避免中断绑定到当前版本的 COM 客户端。 COM 不可见的类型假定在添加新成员时,不需要遵守这些 COM 版本规则。 但是,如果某个 COM 可见类型是从 COM 不可见类型派生的,并公开 ClassInterfaceType.AutoDualAutoDispatch(默认值)的类接口,则将向 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) {}
   }
}

请参见

参考

System.Runtime.InteropServices.ClassInterfaceAttribute

概念

类接口简介

其他资源

与非托管代码交互操作