CA1403: 자동 레이아웃 형식은 COM 노출이면 안 됩니다.
TypeName |
AutoLayoutTypesShouldNotBeComVisible |
CheckId |
CA1403 |
범주 |
Microsoft.Interoperability |
변경 수준 |
주요 변경 |
원인
COM(Component Object Model) 노출 형식은 LayoutKind.Auto로 설정한 System.Runtime.InteropServices.StructLayoutAttribute 특성으로 표시되어 있습니다.
규칙 설명
Auto 레이아웃 형식은 공용 언어 런타임에 의해 관리됩니다.이들 형식의 레이아웃은 .NET Framework 버전 간에 변경될 수 있으므로 특정 레이아웃이 필요한 COM 클라이언트에서는 문제가 발생할 수 있습니다.StructLayoutAttribute 특성을 지정하지 않으면 C#, Visual Basic 및 C++ 컴파일러에서는 값 형식에 대해 Sequential 레이아웃을 지정합니다.
따로 표시되지 않은 경우 제네릭이 아닌 모든 public 형식은 COM에서 볼 수 있으며 public이 아닌 모든 제네릭 형식은 COM에서 볼 수 없습니다.하지만 가양성(false positives)을 줄이기 위해 이 규칙에서는 형식의 COM 노출 여부를 명시적으로 지정하도록 요구합니다. 포함 어셈블리는 false로 설정된 System.Runtime.InteropServices.ComVisibleAttribute로 표시되어야 하며 형식은 true로 설정된 ComVisibleAttribute로 표시되어야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 StructLayoutAttribute 특성의 값을 Explicit 또는 Sequential로 변경하거나 형식을 COM에서 볼 수 없도록 만드십시오.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 이 규칙을 위반하는 형식과 이 규칙을 충족하는 형식을 보여 줍니다.
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;
}
}
관련 규칙
CA1408: AutoDual ClassInterfaceType을 사용하지 마십시오.