다음을 통해 공유


부울 P/Invoke 인수를 MarshalAs로 표시하십시오.

업데이트: 2007년 11월

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

범주

Microsoft.Interoperability

변경 수준

주요 변경

원인

플랫폼 호출 메서드 선언에 System.Boolean 매개 변수나 반환 값이 포함되어 있지만 System.Runtime.InteropServices.MarshalAsAttribute 특성이 매개 변수나 반환 값에 적용되지 않았습니다.

규칙 설명

플랫폼 호출 메서드는 비관리 코드에 액세스하며 System.Runtime.InteropServices.DllImportAttribute 또는 Visual Basic의 경우 Declare를 사용하여 정의됩니다. MarshalAsAttribute는 관리 코드와 비관리 코드 간의 데이터 형식 변환에 사용되는 마샬링 동작을 지정합니다. System.ByteSystem.Int32와 같은 여러 간단한 데이터 형식은 비관리 코드에서 한 가지로 표현되므로 해당 데이터 형식의 마샬링 동작을 지정할 필요가 없습니다. 즉, 공용 언어 런타임에서 자동으로 올바른 동작을 제공합니다.

Boolean 데이터 형식은 비관리 코드에서 여러 가지로 표현됩니다. MarshalAsAttribute를 지정하지 않은 경우 Boolean 데이터 형식에 대한 기본 마샬링 동작은 UnmanagedType.Bool입니다. 이것은 32비트 정수이며 일부 경우에는 적합하지 않습니다. 관리되지 않는 메서드에 필요한 부울 표현은 적절한 System.Runtime.InteropServices.UnmanagedType에 맞도록 결정해야 합니다. UnmanagedType.Bool은 항상 4바이트인 Win32 BOOL 형식입니다. C++ bool 또는 기타 1바이트 형식에는 UnmanagedType.U1을 사용해야 합니다. 자세한 내용은 부울 형식에 대한 기본 마샬링을 참조하십시오.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 Boolean 매개 변수 또는 반환 값에 MarshalAsAttribute를 적용합니다. 특성의 값을 적절한 UnmanagedType으로 설정합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다. 기본 마샬링 동작이 적절하더라도 동작을 명시적으로 지정하면 코드 관리가 더 쉬워집니다.

예제

다음 예제에서는 적절한 MarshalAsAttribute 특성으로 표시된 두 개의 플랫폼 호출 메서드를 보여 줍니다.

Imports System
Imports System.Runtime.InteropServices

<assembly: ComVisible(False)>
Namespace UsageLibrary

   <ComVisible(True)> _
   Class NativeMethods

      Private Sub New()
      End Sub

      <DllImport("user32.dll", SetLastError := True)> _
      Friend Shared Function MessageBeep(uType As UInt32) _
         As <MarshalAs(UnmanagedType.Bool)> Boolean
      End Function

      <DllImport("mscoree.dll", SetLastError := True)> _
      Friend Shared Function StrongNameSignatureVerificationEx( _
         <MarshalAs(UnmanagedType.LPWStr)> wszFilePath As String, _
         <MarshalAs(UnmanagedType.U1)> fForceVerification As Boolean, _
         <MarshalAs(UnmanagedType.U1)> ByRef pfWasVerified As Boolean) _
         As <MarshalAs(UnmanagedType.U1)> Boolean
      End Function

   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(true)]
   internal class NativeMethods
   {
      private NativeMethods() {}

      [DllImport("user32.dll", SetLastError = true)]
      [return: MarshalAs(UnmanagedType.Bool)]
      internal static extern Boolean MessageBeep(UInt32 uType);

      [DllImport("mscoree.dll", 
                 CharSet = CharSet.Unicode, 
                 SetLastError = true)]
      [return: MarshalAs(UnmanagedType.U1)]
      internal static extern bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType.LPWStr)] string wszFilePath,
         [MarshalAs(UnmanagedType.U1)] bool fForceVerification,
         [MarshalAs(UnmanagedType.U1)] out bool pfWasVerified);
   }
}
using namespace System;
using namespace System::Runtime::InteropServices;

[assembly: ComVisible(false)];
namespace InteroperabilityLibrary
{
   [ComVisible(true)]
   ref class NativeMethods
   {
   private:
      NativeMethods() {}

   internal:
      [DllImport("user32.dll", SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::Bool)]
      static Boolean MessageBeep(UInt32 uType);

      [DllImport("mscoree.dll", 
                 CharSet = CharSet::Unicode, 
                 SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::U1)]
      static bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType::LPWStr)] String^ wszFilePath,
         [MarshalAs(UnmanagedType::U1)] Boolean fForceVerification,
         [MarshalAs(UnmanagedType::U1)] Boolean^ pfWasVerified);
   };
}

관련 규칙

P/Invoke 선언은 이식 가능해야 합니다.

P/Invoke 문자열 인수에 대해 마샬링을 지정하십시오.

참고 항목

개념

부울 형식에 대한 기본 마샬링

참조

System.Runtime.InteropServices.UnmanagedType

기타 리소스

비관리 코드와의 상호 운용