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);
}