CA1403: Typy automatycznego układu nie powinny być widoczne dla modelu COM
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
Kategoria |
Microsoft.Interoperability |
Złamanie zmiany |
Złamanie |
Przyczyna
Typ wartości widoczne hosta skryptów systemu Windows (COM, Component Object Model) jest oznaczone StructLayoutAttribute atrybut ustawiony na LayoutKind.Auto.
Opis reguły
AutoUkład typy są zarządzane przez aparatu plików wykonywalnych języka wspólnego.Można zmienić układ tych typów, między wersjami.NET Framework, która spowoduje zerwanie klientów modelu COM, które oczekują, że o określonym układzie.Należy zauważyć, że jeśli StructLayoutAttribute atrybut nie jest określony, C#, Visual Basic, i określ kompilatory C++ Sequential układ dla typów wartości.
Chyba że oznaczona w inny sposób publicznych nierodzajowe są widoczne w modelu COM; wszystkie rodzaje niepubliczne i rodzajowy są niewidoczne dla modelu COM.Aby ograniczyć wyniki fałszywie dodatnie, ta reguła wymaga jednak widoczność COM typu należy wyraźnie podać; Zgromadzenie zawierające muszą być oznaczone ComVisibleAttribute ustawiona na false i typu muszą być oznaczone ComVisibleAttribute ustawiona na true.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, zmień wartość StructLayoutAttribute atrybutu do Explicit lub Sequential, lub uczynić niewidocznym typ modelu COM.
Kiedy do pomijania ostrzeżenia
Nie pomijaj ostrzeżenie od tej reguły.
Przykład
Poniższy przykład pokazuje typ, który narusza reguły i typ, który spełnia regułę.
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;
}
}
Zasady pokrewne
CA1408: Nie używać AutoDual ClassInterfaceType
Zobacz też
Koncepcje
Kwalifikowanie typów .NET do międzyoperacyjności