CA1408: Non utilizzare AutoDual ClassInterfaceType

Articolo Valore
ID regola CA1408
Category Microsoft.Interoperability
Modifica Interruzione

Causa

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

Descrizione 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 usata un'interfaccia solo dispatch.

Se non contrassegnato diversamente, tutti i tipi non generici pubblici sono visibili a COM; tutti i tipi non pubblici e generici sono invisibili a COM.

Come correggere le violazioni

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

Quando eliminare gli avvisi

Non eliminare un avviso da questa regola, a meno che non sia certo che il layout del tipo e i relativi tipi di base non cambieranno in una versione futura.

Esempio

Nell'esempio seguente viene illustrata una classe che viola la regola e una dichiarazione di nuovo della classe per l'uso di un'interfaccia esplicita.

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

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

CA1412: Contrassegnare le interfacce ComSource come IDispatch

Vedi anche