CA1414: 부울 P/Invoke 인수를 MarshalAs로 표시하십시오.
TypeName |
MarkBooleanPInvokeArgumentsWithMarshalAs |
CheckId |
CA1414 |
범주 |
Microsoft.Interoperability |
변경 수준 |
주요 변경 |
원인
플랫폼 호출 메서드 선언에 System.Boolean 매개 변수나 반환 값이 포함되어 있지만 System.Runtime.InteropServices.MarshalAsAttribute 특성이 매개 변수나 반환 값에 적용되지 않았습니다.
규칙 설명
플랫폼 호출 메서드가 비관리 코드에 액세스하고 Visual Basic의 Declare 키워드 또는 System.Runtime.InteropServices.DllImportAttribute를 사용하여 선언되었습니다.MarshalAsAttribute는 관리 코드와 관리되지 않는 코드 간에 데이터 형식을 변환하는 데 사용되는 마샬링 동작을 지정합니다.System.Byte 및 System.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);
};
}
관련 규칙
CA1901: P/Invoke 선언은 이식 가능해야 합니다.
CA2101: P/Invoke 문자열 인수에 대해 마샬링을 지정하십시오.
참고 항목
참조
System.Runtime.InteropServices.UnmanagedType