共用方式為


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

相關規則

CA1403:自動配置型別不應該是 COM 可見

CA1412:將 ComSource 介面標記為 IDispatch

請參閱

概念

類別介面簡介

限定互通的 .NET 型別

其他資源

與 Unmanaged 程式碼互通