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);
}
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기