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