Sdílet prostřednictvím


CA1901: P/Invoke prohlášení by mělo být přenosný

Název_typu

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Kategorie

Microsoft.Portability

Změnit rozdělení

Rozdělení - P/Invoke je viditelná vně sestavení.Bez přerušení - Pokud není viditelný vně sestavení P/Invoke.

Příčina

Toto pravidlo vyhodnotí velikost každého parametru a vrácená hodnota P/Invoke a ověří jejich velikost zařadit, nespravovaný kód na 32bitových a 64bitových platformách.Nejběžnější porušení tohoto pravidla je předat celé číslo pevnou velikostí, kde je vyžadována proměnná závislá na platformě, velikost ukazatele.

Popis pravidla

Některá z následujících scénářů poruší toto pravidlo vyvolá:

  • Vrácená hodnota nebo parametr zadána jako celé číslo pevné velikosti při by měla být zadána jako IntPtr.

  • Vrácená hodnota nebo parametr je zadána jako IntPtr při by měla být zadána jako celé číslo pevné velikosti.

Jak opravit porušení

Toto narušení lze opravit pomocí IntPtr nebo UIntPtr k reprezentaci popisovače místo Int32 nebo UInt32.

Při potlačení upozornění

Nepotlačovat by toto upozornění.

Příklad

Následující příklad ukazuje porušení tohoto pravidla.

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

V tomto příkladu nIconIndex parametr je deklarován jako IntPtr, což je široký na 32bitové platformě a 8 bajtů na 64bitové platformě široké 4 bajty. V následujícím nespravované prohlášení, uvidíte, nIconIndex 4bajtové celé číslo bez znaménka na všech platformách.

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

Chcete-li odstranit narušení změňte následující prohlášení:

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

Viz také

Další zdroje

Přenositelnost varování