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í nesmí být viditelné COM

CA1412: ComSource značka rozhraní IDispatch

Viz také

Koncepty

Úvod do třídy rozhraní

Kvalifikační.Typy sítí pro součinnost

Další zdroje

Spolupráce s nespravovaným kódem.