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