CA1408:不要使用 AutoDual ClassInterfaceType
型別名稱 |
DoNotUseAutoDualClassInterfaceType |
CheckId |
CA1408 |
分類 |
Microsoft.Interoperability |
中斷變更 |
中斷 |
原因
元件物件模型 (COM) 可見的型別是以設定為 ClassInterfaceType 的 AutoDual 值的 ClassInterfaceAttribute 屬性所標記。
規則描述
使用雙重介面 (Dual Interface) 的型別可讓用戶端繫結至特定的介面配置。 在未來版本中,若型別或任何基底型別 (Base Type) 的配置有所變更,將會中斷繫結至此介面的 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