다음을 통해 공유


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

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

범주

Microsoft.Portability

변경 수준

주요 변경 - P/Invoke가 어셈블리 외부에 표시되는 경우, 주요 변경 아님 - P/Invoke가 어셈블리 외부에 표시되지 않는 경우

원인

이 규칙은 P/Invoke의 반환 값과 각 매개 변수의 크기를 계산하여 32비트 및 64비트 플랫폼에서 비관리 코드로 마샬링될 때 그 크기가 올바른지 확인합니다. 이 규칙에 대해 가장 많이 발생하는 위반은 플랫폼에 종속적인 포인터 크기를 갖는 변수가 필요한 곳에 크기가 고정된 정수를 전달하는 것입니다.

규칙 설명

다음 시나리오 중 하나에서 이 규칙 위반이 발생합니다.

  • 반환 값 또는 매개 변수를 IntPtr로 입력해야 할 경우 이러한 값이나 매개 변수가 고정된 크기의 정수로 입력됩니다.

  • 반환 값 또는 매개 변수를 고정된 크기의 정수로 입력해야 할 경우 이러한 값이나 매개 변수가 IntPtr로 입력됩니다.

위반 문제를 해결하는 방법

Int32 또는 UInt32 대신 IntPtr 또는 UIntPtr를 사용하여 핸들을 나타냄으로써 이 위반 문제를 해결할 수 있습니다.

경고를 표시하지 않는 경우

이 경고는 반드시 표시해야 합니다.

예제

다음 예제에서는 이 규칙에 대한 위반 내용을 보여 줍니다.

internal class NativeMethods
{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)]
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, IntPtr nIconIndex);
}

이 예제에서 nIconIndex 매개 변수는 32비트 플랫폼에서 4바이트 너비이고 64비트 플랫폼에서 8바이트 너비인 IntPtr로 선언됩니다. 이어지는 관리되는 선언에서는 nIconIndex가 모든 플랫폼에서 4바이트 부호 없는 정수라는 것을 알 수 있습니다.

HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, 
    UINT nIconIndex);

이 위반 문제를 해결하려면 선언을 다음과 같이 변경합니다.

internal class NativeMethods{
    [DllImport("shell32.dll", CharSet=CharSet.Auto)] 
    internal static extern IntPtr ExtractIcon(IntPtr hInst, 
        string lpszExeFileName, uint nIconIndex);
}

참고 항목

기타 리소스

이식성 경고