¿Te gustaría aprender ASP.NET Core Empresarial?
Tenemos lo que necesitas .¡Haz clic aquí!
En el siguiente artículo vamos a explicarte cómo migrar de .NET a .NET Core, ayudándote de varias herramientas que hay disponibles y mostrándote un ejemplo de una aplicación que vamos a migrar paso a paso.
Como seguramente ya sepas, .NET Core es la última versión disponible y hacia donde se está orientando todo el ecosistema de desarrollo de Microsoft, con una clara serie de ventajas con respecto a .NET, que nos pueden llevar a querer migrar a .NET Core como las siguientes:
- Multiplataforma, vamos a poder usar nuestra aplicación en Windows, Linux y Mac.
- Modular, usando el gestor de paquetes Nuget descargando sólo lo necesario, haciendo nuestra aplicación menos pesada y más escalable.
- Mejor rendimiento, en .NET Core es una feature que está presente para el equipo de Microsoft, con lo que se han centrado en hacerlo de gran rendimiento y con perspectivas de ir mejorando en cada versión que se vaya sacando
- Orientado al uso de microservicios.
- Preparado desde inicio para trabajar con contenedores Docker.
- Time-to-market más rápido y mayor seguridad. La arquitectura modular, las actualizaciones periódicas, el apoyo más amplio de la comunidad, la ligereza, la preparación para la nube e inyección de dependencias incorporada: todo ello agiliza el desarrollo y permite aprovechar el desarrollo y entrega continua.
Puede haber una serie de motivos para no migrar de .NET a .NET Core, puesto que no siempre se puede hacer una migración directa y en ese caso tiene un coste asociado de esfuerzo que debes de valorar si te merece la pena, en base a los puntos anteriormente expuestos, como pueden ser los siguientes:
- Aplicaciones ya en producción, con mucho código ya funcionando y que no tienen una transición directa en tecnología, como puede ser una aplicación WCF en .NET. Para este caso no hay transición directa, una opción podría ser pasarlo a .NET Core ASP.NET usando WebApi, pero como te he mencionando no es directo, y conlleva tiempo de desarrollo.
- Dependencias de librerías de terceros que no han sacado versión para .NET Core. Si se da este caso, tendrías que buscar alguna alternativa a esa dependencia, y comprobar el coste de ese cambio.
- Tu aplicación sólo va a funcionar en Windows y el rendimiento es óptimo. En este caso podrías plantearte no cambiarlo, puesto que algo de tiempo siempre te va a requerir el migrar de .NET a .NET Core y como no, deberías de testearlo todo de nuevo.
Te voy a mostrar, cuales pueden ser unas pautas y herramientas que te pueden ayudar para migrar de .NET a .NET Core, con un ejemplo de una aplicación.
Analizar el código actual con .NET API Portability Analyzer
.NET Portability Analyzer es una extensión de Visual Studio que te ayuda a analizar el código fuente de un proyecto para determinar si es viable su portabilidad hacia otras plataformas.
Vamos a basar el siguiente artículo en una aplicación de consola muy sencilla, que lo único que hace es mostrar los puertos serie que tiene el equipo instalado:
namespace PortsLibrary
{
public class SerialPortHelper
{
public static string[] GetAllPorts()
{
return System.IO.Ports.SerialPort.GetPortNames();
}
}
}
La extensión la puedes buscar e instalar en esta opción de Extensiones, seguido de Administrar extensiones, seleccionas la categoría de En línea y en la caja de búsqueda escribes “portability“, y en el conjunto de resultados de esta búsqueda encontrarás .NET Portability Analyzer. Desde esta misma ventana puedes instalar la extensión, y posteriormente deberás reiniciar Visual para poder tener acceso a ella.
Puedes analizar un ensamblado existente por medio de la opción Analyze Assembly Portability del menú Analizar,
o si quieres analizar el proyecto abierto, puedes hacer clic derecho y seleccionar la opción de Analyze Project Portability.
Además, desde aquí puedes abrir la ventana de configuración para poder configurar las plataformas que estás interesado en conocer si tu código se puede ir hacia ellas. En este pequeño ejemplo vamos a abrir la configuración y lo vamos a configurar para .NET Core 3.11 y .NET Standard 2.1.
Pinchamos en analyze y nos saldrá una ventana como la siguiente en la cual pincharemos en la opción de abrir report.
Nos saldrá un informe en el que podremos ver el porcentaje de portabilidad de este código, el cual puedo ver que para .NET Core y .NET Standard es de un 93,94 %.
Si me voy a la pestaña de Details, puedo ver que esto ocurre porque en este ejemplo estoy utilizando una clase llamada ‘System.IO. Ports.SerialPort’. Esa clase no está soportada en .NET Core y también me reporta que no está soportada en .NET Standard. Sin embargo, me dice que sí está soportada en .NET Core + Platform Extensions. Esto se refiere al uso de Windows Compatibility Pack, que es un paquete de NuGet que tiene clases del sistema operativo Windows que no llegaron a estar en .NET Core ni en .NET Standard al tratarse de implementaciones completamente vinculadas al sistema operativo Windows.
Como resumen podemos ver que .NET Compatibility Analyzer es una herramienta muy interesante y útil para analizar nuestro código para determinar si lo podemos migrar de .NET a .NET Core.
Asegurar máxima compatibilidad
Continuamos trabajando con nuestro pequeño proyecto anterior y vamos a las propiedades del mismo, para ver que lo hemos construido para el Framework 4.7.2.
Este proyecto lo único que hace es listar los puertos serie que tenga la máquina en la que se ejecuta dicho código.
Si este mismo proyecto lo hubiésemos hecho directamente en .Net Core, teniendo una referencia a la biblioteca de clases portslibrary, es decir, desde una app .Net Core referenciando a una dll .net framework, se puede hacer y en principio no hay problema. La aplicación compila perfectamente. Y en principio debería mostrarnos por consola la lista de puertos serie de la máquina en la que se ejecuta dicho código…
Pero si la ejecutamos realmente, al pulsar F5, vemos que me manda una excepción de tipo ‘FileNotFoundException‘ y es que si analizamos más esta excepción, nos dice que no puede encontrar ‘System.IO.Ports‘ porque justamente esa es una serie de clases que no están en .NET Core.
Entonces, ¿qué podemos hacer?
Bueno, la buena noticia es que hay un paquete de NuGet llamado el ‘Microsoft.Windows.Compatibility‘, que es el nombre del paquete de NuGet de algo que se conoce como Windows Compatibility Pack for .NET Core. Este paquete de compatibilidad incluye una serie de clases que pertenecen a Windows.
Por lo tanto, si me agrego el Nuget de la referencia a ‘Microsoft.Windows.Compatibility‘ y nuevamente vamos a compilar y a ejecutar con F5 deberíamos de ver que ya no manda una excepción y efectivamente está funcionando.
El uso de Windows Compatibility Pack es una opción a tener en cuenta si es que estás migrando tu código de .NET hacia .NET Core, si en el paso anterior que hemos visto el Reporte te dice que es la opción a seguir.
Explorar las API de .NET con Apisof.NET
Hay un sitio donde puedes consultar todo el catálogo de API de .NET. Este sitio se llama ‘Apisof.net‘ y dentro de él puedes buscar cualquier tipo de clase, estructura, método, propiedad, delegado… de .NET. Si accedemos a la URL apisof.net podemos ver que tiene mas de 600K APIs indizadas. La interfaz de usuario es muy simple, podemos explorar el catálogo,
o desde Search, buscar usando cualquier tipo de cadena.
En este caso vamos a buscar GetPortNames y pinchamos en el resultado
y veo su implementación, además de la telemetría reportada por parte de .NET,
además de cuáles son las plataformas que implementan este miembro en cuestión.
Por ejemplo, en el caso de .NET Framework, veo que está implementado el método desde .NET FrameWork 2.0 hasta la versión más reciente. Vemos que también está en Universal Windows Platform, en Mono, etc. Y vemos como está para .NET Core + Platform Extensions, que es como hemos solventado la migración en el paso anterior. Esta web te puede ser de gran ayuda para conocer si una clase o miembro concreto de clase está implementado en la plataforma de .NET de tu elección.
La herramienta TryConvert
La herramienta ‘try-convert‘ es una herramienta que nos va a ayudar a hacer algunos ajustes sobre nuestros proyectos a la hora de iniciar nuestra migración. Se trata de un proyecto “open source” alojado en GiHub, pero no es una herramienta completa ni oficial ni con soporte, simplemente es una ayuda extra en estas tareas de migración. Para usarla simplemente clona el repositorio o también puedes descargar desde aquí, desde Releases
o bien puedes instalarla desde la consola con dotnet.
De esta manera tendremos la herramienta instalada de manera global y podremos invocarla desde cualquier sitio.
Tiene algunos parámetros interesantes como, por ejemplo, ‘p’ para indicar la ruta del proyecto a convertir o también la ruta para la solución.
Por ejemplo en nuestro código anterior de invocar el método ‘GetAllPorts‘ de una biblioteca llamada ‘PortsLibrary‘, que es de .NET FrameWork 4.7.2, Lo que he hecho ha sido llevarme esta aplicación a otro directorio como una copia y ejecutar la herramienta try-convert sobre la solución.
Abrimos esta nueva solución y podemos ver que me cra un nuevo archivo ‘csproj‘ y el que tenía lo renombra como ‘.old‘.
Si veo ‘legacyapp.csproj‘, veo que efectivamente lo camba al tipo de MSBuild nuevo para .NET Core.
Si probamos a compilar vemos que compila correctamente y si ejecutamos vemos que funciona correctamente. Pero solo te ayuda con los cambios necesarios para los csproj, con lo que para este proyecto, con lo que como hemos visto anteriormente, una de las maneras que tenemos para solucionar esto es agregar Windows Compatibility Pack, cuyo paquete es ‘Microsoft.Windows.Compatibility’.
Si lo agregamos y lo ejecutamos esta vez si que nos funcionará gracias a la presencia de Windows Compatibility Pack, y además la herramienta ‘try-convert‘ que ayudó en la tarea de convertir el formato anterior de MSBuild al nuevo, pero como mencioné al principio, no es una herramienta completa, ni oficial y tampoco tiene soporte, sino que su idea es ayudarte a iniciar este proceso de migración.
Consejos útiles para migrar de .NET a .NET Core
Cualquier migración requerirá una planificación previa, una supervisión continua, la seguridad del código y tiempo para solucionar los problemas que puedan surgir.
Para una migración más suave estos puede ser una pequeña guía:
- Puedes probar módulos/proyectos más pequeños en lugar de trasladar una base de código completa al .Net Core.
- La herramienta dotnet try-convert te puede ayudar a convertir tu proyecto a .Net Core, pero no es una solución garantizada y puede causar cambios sutiles en el comportamiento. Puedes usarlo como punto de partida para automatizar cosas básicas.
- Identificar la “base” de tu proyecto. Pueden ser los modelos de datos o las clases y métodos esenciales. Copia la base en un nuevo proyecto .NET Core. Haz los cambios necesarios para compilar el código. Copiar otra capa de código y repetirlo, así sucesivamente, paso a paso.
Cada vez son más las empresas que migran a .Net Core por su mejor rendimiento, velocidad, flexibilidad, modularidad y fácil despliegue.
Sin embargo, hay varios inconvenientes de .Net Core, como:
- Las aplicaciones Windows Forms y WPF no son compatibles con .Net Core.
- .Net Core no es compatible con WCF.
- ASP.NET Web Pages y ASP.NET WebForms no están presentes en .Net Core.
- Soporte parcial para VB .NET y F#.
- Todavía no hay planes para llevar WF/WCF+WF/WCF Data Services a .NET Core.
- La compatibilidad con bibliotecas de terceros y algunas funciones faltan en .NET Core.
- Es necesario acceder a las APIs específicas de Windows. Si su aplicación necesita trabajar con el Registro de Windows, WMI u otras API específicas de Windows, no funcionará con .NET Core.
El proceso de migración conlleva un riesgo. Y esa es la razón por la que debe llevarse a cabo con el máximo cuidado y atención. La comunidad de desarrolladores de .Net ofrece un apoyo constante e ideas/sugerencias/consejos para lograr un mayor rendimiento. Además, Microsoft realiza actualizaciones frecuentes y ayuda a los desarrolladores a mantenerse al día con guías y documentación completas.
Te esperamos en los siguientes artículos en donde hablaremos mas acerca de estos temas, los cuales hoy en día son de vital importancia en el mundo de la tecnología.
¿Te gustaría aprender ASP.NET Core Empresarial?
Tenemos lo que necesitas .¡Haz clic aquí!