CA1403: 자동 레이아웃 형식은 COM 노출이면 안 됩니다.
항목 | 값 |
---|---|
RuleId | CA1403 |
범주 | Microsoft.Interoperability |
주요 변경 내용 | 주요 변경 |
원인
COM(구성 요소 개체 모델) 노출 값 형식이 System.Runtime.InteropServices.LayoutKind.Auto로 설정된 System.Runtime.InteropServices.StructLayoutAttribute 특성으로 표시되었습니다.
규칙 설명
LayoutKind 레이아웃 형식은 공용 언어 런타임에서 관리됩니다. 이 형식의 레이아웃은 .NET 버전 간에 변경될 수 있으므로 특정 레이아웃이 필요한 COM 클라이언트가 중단될 수 있습니다. StructLayoutAttribute 특성을 지정하지 않으면 C#, Visual Basic, C++ 컴파일러에서 값 형식으로 LayoutKind.Auto를 지정합니다.
달리 표시되지 않은 경우 제네릭이 아닌 모든 public 형식은 COM에 표시되고, public이 아닌 모든 제네릭 형식은 COM에 표시되지 않습니다. 그러나 이 규칙의 가양성을 줄이려면 형식의 COM 표시 유형을 명시적으로 지정해야 합니다. 포함 어셈블리는 false
로 설정된 System.Runtime.InteropServices.ComVisibleAttribute로 표시해야 하고, 형식은 true
로 설정된 ComVisibleAttribute로 표시해야 합니다.
위반 문제를 해결하는 방법
이 규칙의 위반 문제를 해결하려면 StructLayoutAttribute 특성의 값을 LayoutKind.Explicit 또는 LayoutKind.Sequential로 변경하거나 형식이 COM에에 표시되지 않도록 설정합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예시
다음 예제에서는 규칙을 위반하는 형식과 규칙을 충족하는 형식을 보여 줍니다.
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을 사용하지 마십시오.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기