Estoy usando System.IO.Ports en un proyecto .net 5.0. Esto genera advertencias de la siguiente manera:
advertencia CA1416: este sitio de llamada es accesible en todas las plataformas. 'SerialPort.Close()' no es compatible con: 'ios', 'android'.
Puedo poner guardias para verificar la plataforma antes de llamar a los métodos de SerialPort, pero los llamo en muchos lugares.
En cambio, me preguntaba si había una manera de decirle a .net a nivel de proyecto que no soy compatible con iOS y Android.
No quiero suprimir todas las advertencias de CA1416 porque admito:
...y quiero ser advertido si uso algo que no está disponible en esas plataformas.
TL; DR: Básicamente, su pregunta se divide en dos partes y, lamentablemente, solo una parece ser posible.
OP:
Cómo especificar globalmente que Android e iOS no son compatibles con una aplicación .net 5.0
Puedo poner guardias para verificar la plataforma antes de llamar a los métodos de SerialPort, pero los llamo en muchos lugares.
Si. En lugar de permitir todos los destinos que dice que proporciona net5.0 , puede ajustar su salida utilizando el elemento plural <TargetFrameworks> (tenga en cuenta la "s") en lugar del <TargetFramework> 1 predeterminado.
Aquí hay un proyecto de ejemplo que apunta a net5.0 :
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> </Project>El proyecto anterior permitirá que su aplicación se compile para todos los sistemas operativos, incluidos Windows, Mac OS, Android e iOS .
En cambio, me preguntaba si había una manera de decirle a .net a nivel de proyecto que no soy compatible con iOS y Android.
Si. Para lograrlo, usaríamos TFM específicos del sistema operativo en lugar del net5.0 general. 1
<TargetFramework> a <TargetFrameworks>net5.0 a net5.0-windows;net5.0-macos...al igual que:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net5.0-windows;net5.0-macos</TargetFrameworks> </PropertyGroup> </Project>Con esto se ha eliminado la compatibilidad con iOS y Android.
OP:
No quiero suprimir todas las advertencias de CA1416 porque soy compatible con Windows y Linux.
Aquí es donde se complica, ya que Microsoft no ha definido un TFM para Linux (¿demasiados sabores?), por lo que la única forma de especificar que desea apuntar a Linux es usar net5.0 . El soporte de Linux está implícito. Desafortunadamente, esto reactiva el soporte para iOS y Android , lo que acabamos de eliminar. También activó MacOS que quizás no le interese.
1 Marcos de destino en proyectos de estilo SDK , MSFT
Parafraseando de la documentación de advertencia ;
Puede especificar varios "moniker de marco de destino" (TFM) en las <TargetFramework> o <TargetFrameworks> de sus proyectos. Si el TFM tiene una plataforma de destino, el SDK de .NET inyecta un atributo SupportedOSPlatform con el nombre de la plataforma de destino en el archivo AssemblyInfo.cs, que consume el analizador.
Al analizador no parece importarle a qué marcos apunta, solo los atributos SupportedOSPlatform / UnsupportedOSPlatform compilados en su ensamblaje.
Si bien no puede especificar un conjunto de marcos de destino que permitirían Windows y Linux, pero nada más. Eso no le impide definir múltiples atributos SupportedOSPlatform en su AssemblyInfo.cs;
using System.Runtime.Versioning; [assembly: SupportedOSPlatform("windows")] [assembly: SupportedOSPlatform("linux")] Lo cual creo que debería limitar la forma en que se generan las advertencias CA1416. Incluso si su proyecto hace referencia <TargetFramework>net5.0</TargetFramework> .