Sdílet prostřednictvím


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) a GenerateAssemblyInfo 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

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 na none 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 v false souboru projektu. Další informace naleznete v tématu EnableNETAnalyzers.

Ovlivněná rozhraní API

Pro platformu Windows:

Pro platformu Blazor WebAssembly:

Viz také