Upgrading from WPF App (.NET Framework) [Visual Basic] to .NET 6

Este el va a ser el primero de una serie de posts en los que explicare, desde mi punto de vista, como actualizar nuestros proyectos .NET Framework a .NET 6.

En el día de hoy centrare el tiro en una aplicación WPF en .NET Framework desarrollada con Visual Basic. Sí, con Visual Basic he dicho! Todos a lo largo de nuestra carrera nos hemos encontrado con aplicaciones desarrolladas con Visual Basic y si no es así en vuestro caso os auguró una vida mas longeva!

Más de uno se preguntara y por que actualizar a .NET 6. Pues sencillo, enumero las novedades a continuación:

.NET 6 ofrece las partes finales del plan de unificación de .NET que se inició con .NET 5. .NET 6 unifica el SDK, las bibliotecas base y el entorno de ejecución en aplicaciones móviles, de escritorio, de IoT y en la nube. Además de esta unificación, el ecosistema de .NET 6 ofrece lo siguiente:

Desarrollo simplificado: la introducción es sencilla. Las características nuevas del lenguaje en C# 10 reducen la cantidad de código que necesita escribir. Además, las inversiones en la pila web y las API mínimas hacen que sea fácil escribir rápidamente microservicios más pequeños y más rápidos.

Mejor rendimiento: .NET 6 es el marco web de pila completa más rápido, lo que reduce los costos de proceso si se ejecuta en la nube.

Productividad definitiva: .NET 6 y Visual Studio 2022 proporcionan recarga activa, nuevas herramientas de Git, edición de código inteligente, herramientas de diagnóstico y pruebas sólidas, y una mejor colaboración en equipo.

.NET 6 se admitirá durante tres años como versión de soporte técnico a largo plazo (LTS).

Vamos al lio

.NET Upgrade Assistant es una herramienta de la línea de comandos que nos puede ayudar en la actualización de nuestra aplicación .NET Framework de WPF a .NET 6.

Configuración inicial de demo

Desde Visual Studio, creamos una nueva aplicación de WPF con .NET Framework.

Le asignamos el nombre WpfTest al proyecto y configuramos el proyecto para usar .NET Framework 4.7.2.

Ejecución del asistente para actualización

Abrimos un terminal ejecutamos el comando upgrade-assistant, pasando el nombre del proyecto de destino (puede ejecutar el comando desde cualquier lugar, siempre que la ruta de acceso al archivo de proyecto sea válida).

upgrade-assistant upgrade .\WpfTest.csproj

La herramienta se ejecutara y mostrara una lista de los pasos que va a realizar.

A medida que vamos completando cada paso, la herramienta proporciona un conjunto de comandos que nos permitira aplicar u omitir el paso siguiente, consultar más detalles, configurar el registro o salir del proceso. Si la herramienta detecta que un paso no realizará ninguna acción, omite automáticamente ese paso y continúa al paso siguiente hasta que llega a uno que tiene acciones por realizar. Al presionar Entrar, se iniciará el siguiente paso si no se realiza ninguna otra selección.

En este ejemplo, cada vez se elige el paso Aplicar. El primer paso es realizar una copia de seguridad del proyecto.

La herramienta solicita una ruta de acceso personalizada para la copia de seguridad o bien usar el valor predeterminado, que colocará la copia de seguridad del proyecto en la misma carpeta con una extensión .backup. El siguiente paso que realiza la herramienta es convertir el archivo de proyecto al estilo SDK.

Una vez actualizado el formato del proyecto, el paso siguiente es actualizar el TFM del proyecto.

A continuación, la herramienta actualizara los paquetes NuGet del proyecto.

Una vez actualizados los paquetes, el paso siguiente consiste en agregar archivos de plantilla, si los hay. En este caso, no hay ningún archivo de plantilla que deba agregarse. Este paso continúa y migra los archivos de configuración de la aplicación y actualiza el origen de C# para aplicar correcciones, como se muestra a continuación. Este proyecto no necesitaba ningún archivo de configuración ni cambios de código fuente, por lo que estos pasos se realizaron automáticamente.

Como este es el último proyecto, el paso siguiente, «Pasar al siguiente proyecto», le pide que complete el proceso de migración de toda la solución.

Una vez completado este proceso, el proyecto de WPF migrado tendrá un aspecto similar al siguiente:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <OutputType>WinExe</OutputType>
    <MyType>Custom</MyType>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <UseWPF>true</UseWPF>
    <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <IncrementalBuild>true</IncrementalBuild>
    <DocumentationFile>WpfApp3.xml</DocumentationFile>
    <NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DefineDebug>false</DefineDebug>
    <IncrementalBuild>false</IncrementalBuild>
    <DocumentationFile>WpfApp3.xml</DocumentationFile>
    <NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>
  </PropertyGroup>
  <ItemGroup>
    <Import Include="System.Windows" />
    <Import Include="System.Windows.Controls" />
    <Import Include="System.Windows.Data" />
    <Import Include="System.Windows.Documents" />
    <Import Include="System.Windows.Input" />
    <Import Include="System.Windows.Shapes" />
    <Import Include="System.Windows.Media" />
    <Import Include="System.Windows.Media.Imaging" />
    <Import Include="System.Windows.Navigation" />
  </ItemGroup>
  <ItemGroup>
    <Compile Update="My Project\MyExtensions\MyWpfExtension.vb">
      <VBMyExtensionTemplateID>Microsoft.VisualBasic.WPF.MyExtension</VBMyExtensionTemplateID>
      <VBMyExtensionTemplateVersion>1.0.0.0</VBMyExtensionTemplateVersion>
    </Compile>
    <Compile Update="My Project\Resources.Designer.vb">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Update="My Project\Settings.Designer.vb">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <DesignTimeSharedInput>True</DesignTimeSharedInput>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
    <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.261602">
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="6.0.0" />
  </ItemGroup>
</Project>

Y listo! Ya tenemos nuestro proyecto actualizado a .NET 6, lastima que esta herramienta no convierta el nuestro proyecto Visual Basic a C#.