Sdílet prostřednictvím


CA1408: Nepoužívejte AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Kategorie

Microsoft.interoperability

Narušující změna

Narušující

Příčina

Viditelný typ modelu COM (Component Object Model) je označen atributem ClassInterfaceAttribute nastaveným na hodnotu AutoDual typu ClassInterfaceType.

Popis pravidla

Typy, které používají duální rozhraní umožňují klientům se navázat na určité rozložení rozhraní.Změny v budoucí verzi rozložení typu nebo jakéhokoli základního typu přeruší klienty modulu COM, kteří jsou navázáni na toto rozhraní.Pokud ve výchozím nastavení není zadán atribut ClassInterfaceAttribute, použije se pouze rozhraní určené pro odesílání.

Pokud není označeno jinak, jsou všechny veřejné neobecné typy pro model COM viditelné a všechny neveřejné a obecné typy pro model COM neviditelné.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, změňte hodnotu atributu ClassInterfaceAttribute na hodnotu None typu ClassInterfaceType a explicitně definujte rozhraní.

Kdy potlačit upozornění

Nepotlačujte upozornění od tohoto pravidla, pokud není jisté, že se rozložení typu a jeho základních typů nebude v budoucích verzích měnit.

Příklad

Následující příklad ukazuje třídu, která porušuje toto pravidlo a upravenou deklaraci třídy, která používá explicitní rozhraní.

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

Související pravidla

CA1403: Typy automatického rozložení by neměly být viditelné modelu COM

CA1412: Označte rozhraní ComSource jako IDispatch

Viz také

Koncepty

Představení rozhraní třídy

Kvalifikace typů .NET pro spolupráci

Další zdroje

Spolupráce s nespravovaným kódem