共用方式為


不要使用 AutoDual ClassInterfaceType

更新:2007 年 11 月

型別名稱

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

分類

Microsoft.Interoperability

中斷變更

中斷

原因

COM 可見型別是以設定為 ClassInterfaceType.AutoDualSystem.Runtime.InteropServices.ClassInterfaceAttribute 屬性 (Attribute) 所標記的。

規則描述

使用雙重介面 (Dual Interface) 的型別允許用戶端繫結至特定的介面配置。在未來版本中,若型別或任何基底型別 (Base Type) 的配置有所變更,將會中斷繫結至此介面的 COM 用戶端。依照預設,如果未指定 ClassInterfaceAttribute 屬性,則會使用分派介面。

除非已標記,否則所有公用的非泛型型別對 COM 皆為可見的,而所有非公用的泛型型別對 COM 則皆不可見的。

如何修正違規

若要修正此規則的違規情形,請將 ClassInterfaceAttribute 屬性的值變更為 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() {}
   }
}

相關規則

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

將 ComSource 介面標記為 IDispatch

請參閱

概念

類別介面簡介

限定互通的 .NET 型別

其他資源

與 Unmanaged 程式碼互通