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à