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;
}
}
Regole correlate
CA1408: Non usare AutoDual ClassInterfaceType
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per