CA1408:请不要使用 AutoDual ClassInterfaceType
类型名 |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
类别 |
Microsoft.Interoperability |
是否重大更改 |
是 |
原因
通过将 ClassInterfaceAttribute 属性设置为 ClassInterfaceType 的 AutoDual 值来标记组件对象模型 (COM) 可见的类型。
规则说明
使用双重接口的类型使客户端可以绑定到特定的接口布局。 如果在将来的版本中对该类型或任何基类型的布局进行更改,将中断绑定到该接口的 COM 客户端。 默认情况下,如果未指定 ClassInterfaceAttribute 特性,将使用仅支持调度的接口。
除非另行标记,否则所有公共的非泛型类型都对 COM 可见;所有非公共类型和泛型类型都对 COM 不可见。
如何解决冲突
若要修复与该规则的冲突,请将 ClassInterfaceAttribute 特性的值更改为 ClassInterfaceType 的 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() {}
}
}
相关规则
CA1412:将 ComSource 接口标记为 IDispatch