Guía de porte de aplicaciones de escritorio

La mayoría del código de aplicación se puede clasificar en una de las siguientes áreas:

  • Código de interfaz de usuario (por ejemplo, ventanas y botones)
  • Controles de terceros (por ejemplo, gráficos)
  • Lógica de negocios (por ejemplo, reglas de validación)
  • Acceso y almacenamiento de datos locales
  • Servicios web y acceso remoto a datos

Para Windows Forms y aplicaciones WPF escritas con C# (o Visual Basic.NET), se puede compartir una cantidad sorprendente de la lógica de negocios, el acceso a datos locales y el código de servicios web entre plataformas.

Analizador de portabilidad de .NET

Visual Studio 2017 y versiones posteriores admiten el Analizador de portabilidad de .NET (descarga paraWindows),que puede examinar las aplicaciones existentes y le dice cuánto código se puede porte "tal cual" a otras plataformas. Puede obtener más información al respecto en este vídeo de Channel 9.

También hay una herramienta de línea de comandos que se puede descargar del Analizador de portabilidad en GitHub y usar para proporcionar los mismos informes.

"x% de mi código es portátil. ¿Qué sigue?"

Esperamos que el analizador muestre que una gran parte del código es portátil, pero ciertamente habrá algunas partes de cada aplicación que no se pueden mover a otras plataformas.

Los distintos fragmentos de código probablemente se encontrarán en uno de estos cubos, que se explican con más detalle a continuación:

  • Código portátil que se puede volver a usar
  • Código que requiere cambios
  • Código que no es portátil y requiere una reescribición

Código portátil que se puede volver a usar

El código de .NET que se escribe en las API disponibles en todas las plataformas se puede tomar de forma multiplataforma sin cambios. Idealmente, podrá mover todo este código a una biblioteca de clases portable, una biblioteca compartida o una biblioteca .NET Standard y, a continuación, probarlo en la aplicación existente.

Esa biblioteca compartida se puede agregar a los proyectos de aplicación para otras plataformas (como Android, iOS y macOS).

Código que requiere cambios

Es posible que algunas API de .NET no estén disponibles en todas las plataformas. Si estas API existen en el código, deberá volver a escribir esas secciones para usar API multiplataforma.

Algunos ejemplos de esto son el uso de las API de reflexión que están disponibles en .NET 4.6, pero no están disponibles en todas las plataformas.

Después de volver a escribir el código mediante API portátiles, debería poder empaquetar ese código en una biblioteca compartida y probarlo dentro de la aplicación existente.

Código que no es portátil y requiere una reescribición

Entre los ejemplos de código que no es probable que sean multiplataforma se incluyen:

  • Interfaz de usuario: las Windows forms o WPF no se pueden usar en proyectos en Android o iOS, por ejemplo. La interfaz de usuario tendrá que volver a escribirse, usando esta comparación de controles como referencia.

  • Almacenamiento específico de la plataforma: código que se basa en una tecnología específica de la plataforma (por ejemplo, una base de SQL Server Express local). Tendrá que volver a escribir esto mediante una alternativa multiplataforma (como SQLite para el motor de base de datos). Es posible que también sea necesario ajustar algunas operaciones del sistema de archivos, ya que UWP tiene API ligeramente diferentes a Android e iOS (por ejemplo, algunos sistemas de archivos distinguen mayúsculas de minúsculas y otros no).

  • Componentes de terceros: compruebe si los componentes de terceros de las aplicaciones están disponibles en otras plataformas. Algunos, como los paquetes no visuales NuGet, podrían estar disponibles, pero otros (especialmente los controles visuales, como gráficos o reproductores multimedia).

Sugerencias para hacer que el código se portátil

  • Inserción de dependencias: proporcione implementaciones diferentes para cada plataforma y

  • Enfoque por capas: ya sea MVVM, MVC, MVP u otro patrón que le ayude a separar el código portátil del código específico de la plataforma.

  • Mensajería: puede usar el paso de mensajes en el código para desasoyer interacciones entre diferentes partes de la aplicación.