Sdílet prostřednictvím


CA1901: Deklarace volání nespravovaného kódu by měla být přenosná

TypeName

PInvokeDeclarationsShouldBePortable

CheckId

CA1901

Kategorie

Microsoft.Portability

Narušující změna

Rozdělení - P/Invoke je viditelný vně sestavení.Pevné - li P/Invoke není viditelný vně sestavení.

Příčina

Toto pravidlo vyhodnotí velikost jednotlivých parametrů a vrácené hodnoty P/Invoke a ověří správnost jejich velikosti, pokud bude zařazen do nespravovaného kódu na 32bitových a 64bitových platformách.Nejčastější porušení tohoto pravidla je předat celé číslo s pevnou velikostí, kde je požadována proměnná závislá na platformě, ukazatel velikosti.

Popis pravidla

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

  • Vrácená hodnota nebo parametr je zadán jako pevné velikosti číslo v případě, že by měla být zadána jako IntPtr.

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

Jak vyřešit porušení

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

Kdy potlačit upozornění

Toto varování by neměly potlačit.

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 4 bajty široké na 32bitové platformě a široký na 64bitové platformě 8 bajtů.V nespravované prohlášení, který následuje, je vidět, nIconIndex je celé číslo bez znaménka 4bajtové na všech platformách.

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

Porušení vyřešíte 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

Upozornění přenositelnosti