Freigeben über


CA1408: AutoDual ClassInterfaceType nicht verwenden

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Kategorie

Microsoft.Interoperability

Unterbrechende Änderung

Breaking

Ursache

Ein sichtbarer Component Object Model (COM)-Typ wird mit dem auf den AutoDual-Wert von ClassInterfaceType festgelegten ClassInterfaceAttribute-Attribut markiert.

Regelbeschreibung

Typen, die eine duale Schnittstelle verwenden, ermöglichen Clients die Bindung an ein bestimmtes Schnittstellenlayout. Änderungen an einer zukünftigen Version des Layouts des Typs oder eines Basistyps führen zur Aufhebung der Verbindung zu COM-Clients, die eine Bindung zu der Schnittstelle haben. Standardmäßig wird eine auf Dispatch beschränkte Schnittstelle verwendet, wenn das ClassInterfaceAttribute-Attribut nicht angegeben wird.

Sofern nicht anders markiert, sind alle öffentlichen, nicht generischen Typen für COM sichtbar; alle nicht öffentlichen, generischen Typen sind für COM nicht sichtbar.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, ändern Sie den Wert des ClassInterfaceAttribute-Attributs in den None-Wert von ClassInterfaceType, und definieren Sie die Schnittstelle explizit.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel, es sei denn, es steht fest, dass das Layout des Typs und der zugehörigen Basistypen in einer zukünftigen Version nicht geändert werden.

Beispiel

Im folgenden Beispiel wird eine Klasse veranschaulicht, die gegen die Regel verstößt. Diese Klasse wird neu deklariert, sodass eine explizite Schnittstelle verwendet wird.

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

Verwandte Regeln

CA1403: Typen mit automatischem Layout sollten nicht für COM sichtbar sein

CA1412: ComSource-Schnittstellen als IDispatch markieren

Siehe auch

Konzepte

Einführung in die Klassenschnittstelle

Qualifizieren von .NET-Typen für die Interoperation

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code