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

항목
RuleId 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);
}