{"id":26,"date":"2020-06-11T10:10:00","date_gmt":"2020-06-11T10:10:00","guid":{"rendered":"https:\/\/www.mainmind.com\/blog\/?p=26"},"modified":"2020-07-29T09:12:51","modified_gmt":"2020-07-29T09:12:51","slug":"evaluar-migracion-a-net-core","status":"publish","type":"post","link":"https:\/\/www.mainmind.com\/blog\/evaluar-migracion-a-net-core\/","title":{"rendered":"Evaluar migraci\u00f3n a .NET Core"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Tarde o temprano nos encontraremos con la migraci\u00f3n de frameworks\/tecnolog\u00edas y .NET no iba a ser una excepci\u00f3n. Utilizaremos la herramienta <a href=\"https:\/\/github.com\/microsoft\/dotnet-apiport\" target=\"_blank\" rel=\"noopener noreferrer\">.NET Portability Analyzer<\/a> para un primer vistazo a nuestras librer\u00edas y aplicaciones teniendo como objetivo aplicaciones multiplataforma, microservicios, dockers&#8230; en la nube.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debemos tener claro antes de empezar, la <a href=\"https:\/\/docs.microsoft.com\/es-es\/dotnet\/standard\/choosing-core-framework-server\" target=\"_blank\" rel=\"noopener noreferrer\">recomendaci\u00f3n general de Microsoft<\/a> actualmente es utilizar .NET Core si tenemos que a\u00f1adir nuevas funcionalidades en background, por el momento <a href=\"https:\/\/github.com\/dotnet\/runtime\" target=\"_blank\" rel=\"noopener noreferrer\">.NET Framework<\/a> y <a href=\"https:\/\/github.com\/dotnet\/core\/issues\" target=\"_blank\" rel=\"noopener noreferrer\">.NET Core<\/a> son complementarias. La mayor parte de las API de .NET Core se comparten con .NET Framework<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/docs.microsoft.com\/es-es\/aspnet\/core\/mvc\/overview?view=aspnetcore-3.1\" target=\"_blank\" rel=\"noopener noreferrer\">MVC<\/a> o <a href=\"https:\/\/docs.microsoft.com\/es-es\/aspnet\/core\/tutorials\/first-web-api?view=aspnetcore-3.1&amp;tabs=visual-studio\" target=\"_blank\" rel=\"noopener noreferrer\">WebAPI<\/a>, los candidatos iniciales ideales, o bien <a href=\"https:\/\/docs.microsoft.com\/es-es\/aspnet\/core\/razor-pages\/?view=aspnetcore-3.1&amp;tabs=visual-studio\" target=\"_blank\" rel=\"noopener noreferrer\">Razor Pages<\/a>&nbsp;para Modelo-Vista-Controlador<\/li><li>Silverlight, puedes utilizar <a href=\"https:\/\/www.mobilize.net\/download-silverlight-bridge\" target=\"_blank\" rel=\"noopener noreferrer\">herramientas para ayudar a portar a UWP<\/a>&nbsp;previamente<\/li><li>Consola, adelante aunque siempre existen escenarios dependiendo de las librer\u00edas directamente relacionadas con el sistema operativo<\/li><li><a href=\"https:\/\/docs.microsoft.com\/es-es\/aspnet\/core\/signalr\/introduction?view=aspnetcore-3.1\" target=\"_blank\" rel=\"noopener noreferrer\">SignalR<\/a>, aunque no estuvo inicialmente disponible ahora si.<\/li><li><a href=\"https:\/\/docs.microsoft.com\/es-es\/aspnet\/web-forms\/\" target=\"_blank\" rel=\"noopener noreferrer\">Web Forms<\/a>, olv\u00eddate \u00abpor el momento\u00bb (Como buena pr\u00e1ctica a\u00f1ade el paquete de <a href=\"https:\/\/docs.microsoft.com\/es-es\/dotnet\/standard\/analyzers\/api-analyzer\" target=\"_blank\" rel=\"noopener noreferrer\">analizador de compatibilidad de Roslyn<\/a>)<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aclarado esto, con la <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ConnieYau.NETPortabilityAnalyzer\" target=\"_blank\" rel=\"noopener noreferrer\">extensi\u00f3n para Visual Studio 2019<\/a> instalada ya podemos iniciar el an\u00e1lisis que nos ayudar\u00e1 a identificar las dependencias externas. Dentro de la configuraci\u00f3n de la extensi\u00f3n podemos fijar nuestro objetivo. Todas las acciones tienen su equivalente en l\u00ednea de comandos.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/net_core\/VS2019_Portability_Analyzer_Settings.JPG\" alt=\"\" width=\"772\" height=\"497\"\/><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">Con el bot\u00f3n derecho sobre el proyecto o soluci\u00f3n iniciamos el an\u00e1lisis, con el resultado (en excel en este caso):<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/net_core\/analyze_project_portability.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">Obtenemos los porcentajes de las API de .NET Framework que estar\u00e1n disponibles en cada plataforma que tengamos seleccionada:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/net_core\/ApiPortAnalysis_summary.JPG\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">Para revisar en profundidad, en la pesta\u00f1a \u00abDetalles\u00bb podemos ver las librer\u00edas\/ensamblados no soportados para cada versi\u00f3n:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/net_core\/ApiPortAnalysis_details.JPG\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">Los ensamblados que faltan y no han podido ser analizados en esta ejecuci\u00f3n, deberemos incluirlos o buscar la versi\u00f3n m\u00e1s reciente:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/\/2020\/net_core\/ApiPortAnalysis_missing_assemblies.JPG\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">En cualquier caso y previo a este trabajo siempre es bueno revisar las <a href=\"https:\/\/docs.microsoft.com\/es-es\/visualstudio\/code-quality\/code-metrics-values?view=vs-2019\" target=\"_blank\" rel=\"noopener noreferrer\">M\u00e9tricas de c\u00f3digo del proyecto<\/a>&nbsp;propias de Visual Studio o de <a href=\"https:\/\/www.sonarqube.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">terceros<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li style=\"text-align: left;\">\u00cdndice de mantenimiento<\/li><li style=\"text-align: left;\">Complejidad ciclom\u00e1tica<\/li><li style=\"text-align: left;\">Profundidad de herencia<\/li><li style=\"text-align: left;\">Acoplamiento de clases<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Tarde o temprano nos encontraremos con la migraci\u00f3n de frameworks\/tecnolog\u00edas y .NET no iba a ser una excepci\u00f3n. Utilizaremos la herramienta .NET Portability Analyzer para un primer vistazo a nuestras librer\u00edas y aplicaciones teniendo como objetivo aplicaciones multiplataforma, microservicios, dockers&#8230; en la nube. Debemos tener claro antes de empezar, la recomendaci\u00f3n general de Microsoft actualmente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[30,55,29,56,57],"class_list":["post-26","post","type-post","status-publish","format-standard","hentry","category-visual-studio","tag-migracion","tag-migrate","tag-migration","tag-net","tag-net-core"],"_links":{"self":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":0,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}