Udostępnij za pośrednictwem


CA1408: Nie należy używać AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Kategoria

Microsoft.Interoperability

Zmiana kluczowa

Kluczowa

Przyczyna

Widoczny typ modelu Component Object Model (COM) jest oznaczony ClassInterfaceAttribute atrybutem ustawionym na AutoDual wartość ClassInterfaceType.

Opis reguły

Typy, które korzystają z podwójnych interfejsów, umożliwiają klientom powiązanie z określonym interfejsem.Wszelkie zmiany w przyszłej wersji układ typu lub wszelkich typów podstawowych spowoduje przerwanie klientów COM powiązanych z interfejsem.Domyślnie jeśli atrybut ClassInterfaceAttribute nie jest określony, używany jest interfejs służący tylko do wysłania.

Chyba że oznaczono inaczej, wszystkie publiczne typy niegeneryczne są widoczne w modelu COM; wszystkie typy niepublicznych i generyczne są niewidoczne dla modelu COM.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, zmień wartość atrybutu ClassInterfaceAttribute na None wartości ClassInterfaceType i jawnie zdefiniuj interfejsu.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżenie od tej reguły, chyba że jest pewne, że ten układ typu i jego typów podstawowych nie ulegnie zmianie w przyszłej wersji.

Przykład

Poniższy przykład pokazuje klasę, która narusza regułę i ponowną deklarację klasy używającą jawnego interfejsu.

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

Powiązane reguły

CA1403: Automatyczny układ typów nie powinny być widoczne COM

CA1412: Mark ComSource interfejsy jako interfejsu IDispatch

Zobacz też

Koncepcje

Wprowadzenie interfejsu klasy

Kwalifikujące się.Typy sieci współpracy

Inne zasoby

Współdziałanie z kodu niezarządzanego