Condividi tramite


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

Articolo Valore
ID regola CA1403
Category Microsoft.Interoperability
Modifica Interruzione

Causa

Un tipo di valore visibile COM (Component Object Model) è contrassegnato con l'attributo System.Runtime.InteropServices.StructLayoutAttribute impostato su System.Runtime.InteropServices.LayoutKind.Auto.

Descrizione regola

LayoutKind I tipi di layout vengono gestiti da Common Language Runtime. Il layout di questi tipi può cambiare tra le versioni di .NET, che interrompe i client COM che prevedono un layout specifico. Se l'attributo StructLayoutAttribute non viene specificato, i compilatori C#, Visual Basic e C++ specificano LayoutKind.Auto per i tipi valore.

Se non contrassegnato diversamente, tutti i tipi pubblici, non generici sono visibili a COM e tutti i tipi non pubblici e generici sono invisibili a COM. Tuttavia, per ridurre i falsi positivi, questa regola richiede che la visibilità COM del tipo venga dichiarata in modo esplicito. L'assembly contenitore deve essere contrassegnato con il System.Runtime.InteropServices.ComVisibleAttribute set su false e il tipo deve essere contrassegnato con l'oggetto ComVisibleAttribute impostato su true.

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare il valore dell'attributo StructLayoutAttribute in LayoutKind.Explicit o LayoutKind.Sequential oppure rendere il tipo invisibile a COM.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio seguente viene illustrato un tipo che viola la regola e un tipo che soddisfa la regola.

using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   // This violates the rule.
   [StructLayout(LayoutKind.Auto)]
   [ComVisible(true)]
   public struct AutoLayout
   {
      public int ValueOne;
      public int ValueTwo;
   }

   // This satisfies the rule.
   [StructLayout(LayoutKind.Explicit)]
   [ComVisible(true)]
   public struct ExplicitLayout
   {
      [FieldOffset(0)]
      public int ValueOne;

      [FieldOffset(4)]
      public  int ValueTwo;
   }
}

CA1408: Non usare AutoDual ClassInterfaceType

Vedi anche