Aviso CA1416: compatibilidade da plataforma
A regra CA1416 do analisador de código do .NET está habilitada por padrão do .NET 5 em diante. Ele produz um aviso de build para chamadas a APIs específicas da plataforma de sites de chamada que não verificam o sistema operacional.
Descrição das alterações
Do .NET 5 em diante, o SDK do .NET inclui Analisadores de código-fonte do .NET. Várias dessas regras são habilitadas, por padrão, inclusive a CA1416. Se o projeto contiver um código que viole essa regra e estiver configurado para tratar avisos como erros, essa alteração poderá interromper o build. A regra CA1416 informa quando você está usando APIs específicas da plataforma em locais onde o contexto da plataforma não é verificado.
A regra CA1416, o analisador de compatibilidade da plataforma, opera lado a lado com alguns outros recursos que são novos no .NET 5. O .NET 5 apresenta SupportedOSPlatformAttribute e UnsupportedOSPlatformAttribute, que permite especificar as plataformas em que uma API tem ou não tem suporte. Na ausência desses atributos, supõe-se que uma API tenha suporte em todas as plataformas. Esses atributos foram aplicados a APIs específicas da plataforma nas bibliotecas principais do .NET.
Em projetos destinados a plataformas para as quais as APIs que eles usam não estão disponíveis, a regra CA1416 sinaliza qualquer chamada à API específica da plataforma em que o contexto da plataforma não é verificado. A maioria das APIs que agora são decoradas com os atributos SupportedOSPlatformAttribute e UnsupportedOSPlatformAttribute geram exceções PlatformNotSupportedException quando são invocadas em um sistema operacional sem suporte. Agora que essas APIs estão marcadas como específicas da plataforma, a regra CA1416 ajuda você a evitar exceções PlatformNotSupportedException no tempo de execução adicionando verificações de SO aos sites de chamadas.
Exemplos
O método Console.Beep(Int32, Int32) só tem suporte no Windows e é decorado com
[SupportedOSPlatform("windows")]
. O código a seguir produzirá um aviso CA1416 no momento da compilação se o projeto for direcionado paranet5.0
(multiplataforma). Mas esse código não avisará se o projeto for direcionado ao Windows (net5.0-windows
) eGenerateAssemblyInfo
estiver habilitado para o projeto. Para ver as ações que podem ser executadas para evitar o aviso, confira Ações recomendadas.public void PlayCMajor() { Console.Beep(261, 1000); }
O método Image.FromFile(String) não tem suporte no navegador e é decorado com
[UnsupportedOSPlatform("browser")]
. O código a seguir produzirá um aviso CA1416 no momento do build se o projeto der suporte à plataforma do navegador.public void CreateImage() { Image newImage = Image.FromFile("SampImag.jpg"); }
Dica
Projetos do Blazor WebAssembly e da Biblioteca de Classes Razor incluem o suporte ao navegador automaticamente. Para adicionar manualmente o navegador como uma plataforma com suporte em seu projeto, adicione a seguinte entrada ao arquivo de projeto:
<ItemGroup> <SupportedPlatform Include="browser" /> </ItemGroup>
Versão introduzida
5,0
Ação recomendada
Verifique se as APIs específicas da plataforma só são chamadas quando o código está em execução em uma plataforma apropriada. Você pode verificar o sistema operacional atual usando um dos métodos Is<Platform>
da classe System.OperatingSystem, por exemplo, OperatingSystem.IsWindows(), antes de chamar uma API específica da plataforma.
Você pode usar um dos métodos Is<Platform>
na condição de uma instrução if
:
public void PlayCMajor()
{
if (OperatingSystem.IsWindows())
{
Console.Beep(261, 1000);
}
}
Ou, se não quiser a sobrecarga de uma instrução if
adicional em tempo de execução, chame Debug.Assert(Boolean) em vez disso:
public void PlayCMajor()
{
Debug.Assert(OperatingSystem.IsWindows());
Console.Beep(261, 1000);
}
Se você estiver criando uma biblioteca, poderá marcar sua API como específica da plataforma. Nesse caso, o ônus de verificar os requisitos recai sobre seus chamadores. Você pode marcar métodos, tipos específicos ou um assembly inteiro.
[SupportedOSPlatform("windows")]
public void PlayCMajor()
{
Console.Beep(261, 1000);
}
Se você não quiser corrigir todos os seus sites de chamadas, poderá escolher uma das seguintes opções para suprimir o aviso:
Para suprimir a regra CA1416, você pode fazer isso usando
#pragma
ou o sinalizador do compilador NoWarn, ou ainda definir a gravidade da regra comonone
no arquivo .editorconfig.public void PlayCMajor() { #pragma warning disable CA1416 Console.Beep(261, 1000); #pragma warning restore CA1416 }
Para desabilitar completamente a análise de código, defina
EnableNETAnalyzers
comofalse
no arquivo de projeto. Para obter mais informações, confira EnableNETAnalyzers.
APIs afetadas
Para a plataforma Windows:
- Todas as APIs listadas em 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
Para a plataforma Blazor WebAssembly:
- Todas as APIs listadas em https://github.com/dotnet/runtime/issues/41087.