Condividi tramite


CA1408: Non utilizzare AutoDual ClassInterfaceType

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

Category

Microsoft.Interoperability

Breaking Change

Breaking

Causa

Un tipo visibile a COM (Component Object Model) è contrassegnato con l'attributo ClassInterfaceAttribute impostato sul valore AutoDual di ClassInterfaceType.

Descrizione della regola

I tipi che utilizzano un'interfaccia duale consentono l'associazione dei client a uno specifico layout di interfaccia.Eventuali modifiche apportate in una versione futura al layout del tipo o ai tipi base interromperanno l'associazione dei client COM all'interfaccia.Per impostazione predefinita, se l'attributo ClassInterfaceAttribute non è specificato, viene utilizzata un'interfaccia di solo invio.

A meno che non sia specificato diversamente, tutti i tipi pubblici non generici sono visibili a COM, mentre i tipi non pubblici e generici sono invisibili.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare il valore dell'attributo ClassInterfaceAttribute nel valore None di ClassInterfaceType e definire in modo esplicito l'interfaccia.

Esclusione di avvisi

Non escludere un avviso per questa regola a meno che non sia certo che il layout del tipo e i relativi tipi base non verranno modificati in una versione successiva.

Esempio

Nell'esempio riportato di seguito sono riportate una classe che viola le regole e una nuova dichiarazione della classe per l'utilizzo di un'interfaccia esplicita.

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

Regole correlate

CA1403: I tipi layout automatici non devono essere visibili a COM

CA1412: Contrassegnare le interfacce ComSource come IDispatch

Vedere anche

Concetti

Introduzione all'interfaccia della classe

Qualificazione di tipi .NET per l'interoperabilità

Altre risorse

Interoperabilità con codice non gestito