Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Cómo migrar de .NET a .NET Core

César Díaz Alcolea
Cómo migrar de .NET a .NET Core

En el siguiente artículo voy a tratar de 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.

m1

Puedes analizar un ensamblado existente por medio de la opción Analyze Assembly Portability del menú Analizar,

image-20210123160609741

o si quieres analizar el proyecto abierto, puedes hacer clic derecho y seleccionar la opción de Analyze Project Portability.

image-20210123160639156

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.

image-20210123160744060

Pinchamos en analyze y nos saldrá una ventana como la siguiente en la cual pincharemos en la opción de abrir report.

image-20210123160820371

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 %.

image-20210123160842002

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.

image-20210123160902424

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.

image-20210123162211106

Este proyecto lo único que hace es listar los puertos serie que tenga la máquina en la que se ejecuta dicho código.

image-20210123162236743

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,

image-20210129140655722

image-20210123162601165

o desde Search, buscar usando cualquier tipo de cadena.

En este caso vamos a buscar GetPortNames y pinchamos en el resultado

image-20210123162616270

y veo su implementación, además de la telemetría reportada por parte de .NET,

image-20210123162638770

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.

image-20210123162647765

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

image-20210123162757012

o bien puedes instalarla desde la consola con dotnet.

image-20210123162816744

De esta manera tendremos la herramienta instalada de manera global y podremos invocarla desde cualquier sitio.

image-20210123162831927

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.

image-20210123162848443

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.

image-20210123162929947

Abrimos esta nueva solución y podemos ver que me cra un nuevo archivo ‘csproj‘ y el que tenía lo renombra como ‘.old‘.

image-20210125143203383

Si veo ‘legacyapp.csproj‘, veo que efectivamente lo camba al tipo de MSBuild nuevo para .NET Core.

image-20210125143444603

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’.

image-20210125143536728

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.

Si quieres saber más acerca de .NET Core y .NET te recomiendo los siguientes recursos:

Qué es .NET Core

Curso de .NET Framework

Relacionado

Te dejamos una selección de cursos, carreras y artículos

Qué es NET Framework

Qué es NET Framework

Frameworks

22 de Julio de 2019

Un framework consiste en una serie de estructuras y tecnología definidas que básicamente facilita la programación. Cuando hablamos de .NET Framework, estamos hablando de este conjunto de estructura...

.NET vs Java

.NET vs Java

Lenguajes de programación

03 de Septiembre de 2020

Comparamos dos de los lenguajes de programación más interesantes, así podrás conocer las virtudes de cada uno de ellos y sus puntos débiles.

Curso de .NET Framework

Curso de .NET Framework

curso

Con este curso aprenderás:

  • Administrar y modelar una base de datos SQL SERVER.
  • Creación de capas abstraídas (presentación-negocio-datos) con Visual Studio.
  • Diseñar y administrar una interfaz de usuario con Winforms

Duración: 4 horas y 34 minutos

Más de 300 empresas confían en nosotros

Oesia
Vass
Everis
Ayesa
Altran
Ibermatica
Atmira
GFI
Accenture
GMV
Concatel
Telefonica
Caser
Banco de España
kpmg
Mapfre
Randstad