Udostępnij za pośrednictwem


CA1408: Nie 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: Typy automatycznego układu nie powinny być widoczne dla modelu COM

CA1412: Oznacz interfejsy ComSource jako IDispatch

Zobacz też

Koncepcje

Wprowadzenie interfejsu klasy

Kwalifikowanie typów .NET do międzyoperacyjności

Inne zasoby

Współdziałanie z kodem niezarządzanym