다음을 통해 공유


CA1403: 자동 레이아웃 형식은 COM 노출이면 안 됩니다.

TypeName

AutoLayoutTypesShouldNotBeComVisible

CheckId

CA1403

범주

Microsoft.Interoperability

변경 수준

주요 변경

원인

COM(Component Object Model) 노출 형식은 LayoutKind.Auto로 설정한 StructLayoutAttribute 특성으로 표시되어 있습니다.

규칙 설명

Auto 레이아웃 형식은 공용 언어 런타임에 의해 관리됩니다.이들 형식의 레이아웃은 .NET Framework 버전 간에 변경될 수 있으므로 특정 레이아웃이 필요한 COM 클라이언트에서는 문제가 발생할 수 있습니다.StructLayoutAttribute 특성을 지정하지 않으면 C#, Visual Basic 및 C++ 컴파일러에서는 값 형식에 대해 Sequential 레이아웃을 지정합니다.

따로 표시되지 않은 경우 제네릭이 아닌 모든 public 형식은 COM에서 볼 수 있으며 public이 아닌 모든 제네릭 형식은 COM에서 볼 수 없습니다.하지만 가양성(false positives)을 줄이기 위해 이 규칙에서는 형식의 COM 노출 여부를 명시적으로 지정하도록 요구합니다. 포함 어셈블리는 false로 설정된 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을 사용하지 마십시오.

참고 항목

개념

클래스 인터페이스 소개

상호 운용할 .NET 형식의 정규화

기타 리소스

비관리 코드와의 상호 운용