共用方式為


CA1901:P/Invoke 宣告應該是可移植的

型別名稱

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

分類

Microsoft.Portability

中斷變更

中斷 - 如果可以在組件外部看見 P/Invoke。 非中斷 - 如果不能在組件外部看見 P/Invoke。

原因

這項規則會評估每個參數的大小和 P/Invoke 的傳回值,並且在 32 位元和 64 位元平台上封送處理至 Unmanaged 程式碼時驗證其大小是否正確。 這項規則最常見的違規情形,就是在需要與平台相關之指標大小變數的地方傳遞固定大小的整數。

規則描述

下列任一案例違反此規則,就會發生:

  • 傳回值或參數的型別應該是 IntPtr,但其型別卻是固定大小的整數。

  • 傳回值或參數的型別應該固定大小的整數,但其型別卻是 IntPtr。

如何修正違規

您可以使用 IntPtr 或 UIntPtr 表示控制代碼 (而不是 Int32 或 UInt32),藉以修正此違規情形。

隱藏警告的時機

您不應該隱藏這項警告。

範例

下列範例示範這項規則的違規情形。

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

在這個範例中,nIconIndex 參數宣告為 IntPtr,它在 32 位元平台上是 4 個位元組寬,在 64 位元平台上則是 8 個位元組寬。在接下來的 Unmanaged 宣告中,您會看到 nIconIndex 在所有平台上都是 4 個位元組不帶正負號的整數 (Unsigned Integer)。

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

請參閱

其他資源

可攜性警告