Condividi tramite


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

TypeName

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

Category

Microsoft.Interoperability

Breaking Change

Breaking

Causa

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

Descrizione della regola

I tipi di layout Auto sono gestiti da Common Language Runtime. Il layout di tali tipi può variare a seconda delle versioni di .NET Framework, con conseguente compromissione delle funzionalità dei client COM che prevedono un layout specifico. Si noti che se l'attributo StructLayoutAttribute non è specificato, i compilatori C#, Visual Basic e C++ specificheranno il layout Sequential per i tipi di valori.

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. Per ridurre i falsi positivi, tuttavia, la regola richiede che la visibilità COM del tipo sia dichiarata esplicitamente. L'assembly che lo contiene deve essere contrassegnato dall'impostazione dell'oggetto System.Runtime.InteropServices.ComVisibleAttribute su false mentre il tipo deve essere contrassegnato dall'impostazione dell'oggetto ComVisibleAttribute su true.

Come correggere le violazioni

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

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito vengono illustrati due tipi: uno che viola la regola e uno che la soddisfa.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   ' This violates the rule.
   <StructLayoutAttribute(LayoutKind.Auto)> _ 
   <ComVisibleAttribute(True)> _ 
   Public Structure AutoLayout

      Dim ValueOne As Integer
      Dim ValueTwo As Integer 

   End Structure

   ' This satisfies the rule.
   <StructLayoutAttribute(LayoutKind.Explicit)> _ 
   <ComVisibleAttribute(True)> _ 
   Public Structure ExplicitLayout

      <FieldOffsetAttribute(0)> _ 
      Dim ValueOne As Integer

      <FieldOffsetAttribute(4)> _ 
      Dim ValueTwo As Integer 

   End Structure

End Namespace
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;
   }
}

Regole correlate

CA1408: Non utilizzare AutoDual ClassInterfaceType

Vedere anche

Concetti

Introduzione all'interfaccia della classe

Qualificazione di tipi .NET per l'interoperabilità

Altre risorse

Interoperabilità con codice non gestito