Upozornění CA1416: Kompatibilita platformy
Pravidlo analyzátoru kódu .NET CA1416 je ve výchozím nastavení povolené od verze .NET 5. Vytvoří upozornění sestavení pro volání rozhraní API specifických pro platformu z lokalit volání, které neověřují operační systém.
Změna popisu
Počínaje rozhraním .NET 5 obsahuje sada .NET SDK analyzátory zdrojového kódu .NET. Ve výchozím nastavení je povoleno několik z těchto pravidel, včetně CA1416. Pokud váš projekt obsahuje kód, který porušuje toto pravidlo a je nakonfigurovaný tak, aby zacházel s upozorněními jako s chybami, může tato změna přerušit sestavení. Pravidlo CA1416 vás informuje, když používáte rozhraní API specifická pro platformu z míst, kde není ověřený kontext platformy.
Pravidlo CA1416, analyzátor kompatibility platformy, funguje ručně s některými dalšími funkcemi, které jsou v .NET 5 nové. .NET 5 zavádí SupportedOSPlatformAttribute platformy, UnsupportedOSPlatformAttributekteré umožňují určit platformy, které rozhraní API je nebo není podporováno. V případě absence těchto atributů se předpokládá, že rozhraní API bude podporováno na všech platformách. Tyto atributy byly použity pro rozhraní API specifická pro platformu v základních knihovnách .NET.
V projektech, které cílí na platformy, pro která rozhraní API, která používají, nejsou dostupná, označí ca1416 příznakem volání rozhraní API specifického pro platformu, kde není ověřený kontext platformy. Většinarozhraníchm rozhraním API a UnsupportedOSPlatformAttribute atributům PlatformNotSupportedException vyvolává SupportedOSPlatformAttribute výjimky při vyvolání v nepodporovaném operačním systému. Teď, když jsou tato rozhraní API označená jako specifická pro platformu, pomáhá pravidlo CA1416 zabránit výjimkám za běhu PlatformNotSupportedException přidáním kontrol operačního systému na weby volání.
Příklady
Metoda Console.Beep(Int32, Int32) je podporována pouze ve Windows a je zdobena
[SupportedOSPlatform("windows")]
. Následující kód vygeneruje upozornění CA1416 v době sestavení, pokud cílínet5.0
projekt (napříč platformami). Tento kód ale nebude varovat, pokud projekt cílí na Windows (net5.0-windows
) aGenerateAssemblyInfo
je pro projekt povolený. Akce, které můžete provést, abyste se upozornění vyhnuli, najdete v části Doporučená akce.public void PlayCMajor() { Console.Beep(261, 1000); }
Metoda Image.FromFile(String) není podporována v prohlížeči a je zdobena
[UnsupportedOSPlatform("browser")]
. Následující kód vytvoří upozornění CA1416 v době sestavení, pokud projekt podporuje platformu prohlížeče.public void CreateImage() { Image newImage = Image.FromFile("SampImag.jpg"); }
Tip
Projekty Blazor WebAssembly a projekty knihovny tříd Razor zahrnují podporu prohlížeče automaticky. Pokud chcete ručně přidat prohlížeč jako podporovanou platformu pro váš projekt, přidejte do souboru projektu následující položku:
<ItemGroup> <SupportedPlatform Include="browser" /> </ItemGroup>
Zavedená verze
5,0
Doporučená akce
Ujistěte se, že se rozhraní API specifická pro platformu volají jenom v případě, že kód běží na příslušné platformě. Aktuální operační systém můžete zkontrolovat pomocí jedné z Is<Platform>
metod třídy System.OperatingSystem , OperatingSystem.IsWindows()například , před voláním rozhraní API specifického pro platformu.
V podmínce if
příkazu můžete použít jednu z Is<Platform>
metod:
public void PlayCMajor()
{
if (OperatingSystem.IsWindows())
{
Console.Beep(261, 1000);
}
}
Nebo pokud nechcete režii dalšího if
příkazu za běhu, zavolejte Debug.Assert(Boolean) místo toho:
public void PlayCMajor()
{
Debug.Assert(OperatingSystem.IsWindows());
Console.Beep(261, 1000);
}
Pokud knihovnu vytvoříte, můžete rozhraní API označit jako specifické pro danou platformu. V tomto případě na volajícího spadá zátěž kontroly požadavků. Můžete označit konkrétní metody nebo typy nebo celé sestavení.
[SupportedOSPlatform("windows")]
public void PlayCMajor()
{
Console.Beep(261, 1000);
}
Pokud nechcete opravit všechny weby volání, můžete zvolit jednu z následujících možností, které upozornění potlačí:
Pokud chcete potlačit pravidlo CA1416, můžete to udělat pomocí
#pragma
příznaku kompilátoru NoWarn nebo nastavením závažnosti pravidla nanone
soubor .editorconfig.public void PlayCMajor() { #pragma warning disable CA1416 Console.Beep(261, 1000); #pragma warning restore CA1416 }
Pokud chcete analýzu kódu úplně zakázat, nastavte
EnableNETAnalyzers
vfalse
souboru projektu. Další informace naleznete v tématu EnableNETAnalyzers.
Ovlivněná rozhraní API
Pro platformu Windows:
- Všechna rozhraní API uvedená na adrese https://github.com/dotnet/designs/blob/main/accepted/2020/windows-specific-apis/windows-specific-apis.md.
- System.Security.Cryptography.DSAOpenSsl
- System.Security.Cryptography.ECDiffieHellmanOpenSsl
- System.Security.Cryptography.ECDsaOpenSsl
- System.Security.Cryptography.RSAOpenSsl
Pro platformu Blazor WebAssembly:
- Všechna rozhraní API uvedená na adrese https://github.com/dotnet/runtime/issues/41087.