Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Esta es la primera parte de un tutorial que muestra cómo modernizar una aplicación de escritorio de WPF de ejemplo denominada Contoso Expenses. Para obtener información general sobre el tutorial, los requisitos previos e instrucciones para descargar la aplicación de ejemplo, consulte Tutorial: Modernización de una aplicación wpF.
En esta parte del tutorial, migrará toda la aplicación Contoso Expenses de .NET Framework 4.7.2 a .NET Core 3. Antes de iniciar esta parte del tutorial, asegúrese de abrir y compilar el ejemplo ContosoExpenses en Visual Studio 2019.
Nota:
Para obtener más información sobre cómo migrar una aplicación WPF desde .NET Framework a .NET Core 3, consulte esta serie de blog.
Migración del proyecto ContosoExpenses a .NET Core 3
En esta sección, migrará el proyecto ContosoExpenses en la aplicación Contoso Expenses a .NET Core 3. Para ello, creará un nuevo archivo de proyecto que contiene los mismos archivos que el proyecto ContosoExpenses existente, pero tiene como destino .NET Core 3 en lugar de .NET Framework 4.7.2. Esto le permite mantener una única solución con versiones de .NET Framework y .NET Core de la aplicación.
Compruebe que el proyecto ContosoExpenses tiene como destino actualmente .NET Framework 4.7.2. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto ContosoExpenses, elija Propiedadesy confirme que la propiedad Marco de trabajo de destino en la pestaña Aplicación está establecida en .NET Framework 4.7.2.
En el Explorador de Windows, vaya a la carpeta C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses y cree un nuevo archivo de texto denominado ContosoExpenses.Core.csproj.
Haga clic con el botón derecho en el archivo, elija Abrir con y ábralo en un editor de texto de su elección, como el Bloc de notas, Visual Studio Code o Visual Studio.
Copie el texto siguiente en el archivo y guárdelo.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>Cierre el archivo y vuelva a la solución de ContosoExpenses en Visual Studio.
Haga clic con el botón derecho en la solución ContosoExpenses y elija Agregar -> proyecto existente. Seleccione el archivo ContosoExpenses.Core.csproj que acaba de crear en la
C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpensescarpeta para agregarlo a la solución.
El ContosoExpenses.Core.csproj incluye los siguientes elementos:
- El elemento del proyecto
especifica una versión del SDK de Microsoft.NET.Sdk.WindowsDesktop . Esto hace referencia a aplicaciones .NET para escritorio de Windows e incluye componentes para aplicaciones de WPF y Windows Forms. - El elemento PropertyGroup contiene elementos secundarios que indican que la salida del proyecto es un ejecutable (no un archivo DLL), tiene como destino .NET Core 3 y usa WPF. Para una aplicación de Windows Forms, usaría un elemento UseWinForms en lugar del elemento UseWPF .
Nota:
Cuando se trabaja con el formato .csproj introducido con .NET Core 3.0, todos los archivos de la misma carpeta que .csproj se consideran parte del proyecto. Por lo tanto, no es necesario especificar todos los archivos incluidos en el proyecto. Debe especificar solo los archivos para los que desea definir una acción de compilación personalizada o que quiera excluir.
Migración del proyecto ContosoExpenses.Data a .NET Standard
La solución
Para migrar el proyecto ContosoExpenses.Data a .NET Standard:
En Visual Studio, haga clic con el botón derecho en el proyecto ContosoExpenses.Data y elija Descargar Proyecto. Vuelva a hacer clic con el botón derecho en el proyecto y elija Editar ContosoExpenses.Data.csproj.
Elimine todo el contenido del archivo del proyecto.
Copie y pegue el siguiente CÓDIGO XML y guarde el archivo.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>Haga clic con el botón derecho en el proyecto ContosoExpenses.Data y elija Recargar proyecto.
Configuración de paquetes y dependencias de NuGet
Al migrar los proyectos de ContosoExpenses.Core y ContosoExpenses.Data en las secciones anteriores, ha quitado las referencias del paquete NuGet de los proyectos. En esta sección, volverás a agregar estas referencias.
Para configurar paquetes NuGet para el proyecto ContosoExpenses.Data:
En el proyecto ContosoExpenses.Data, expanda el nodo Dependencias. Tenga en cuenta que falta la sección NuGet.
Si abre el Packages.config en el Explorador de soluciones de , encontrará las referencias "antiguas" de los paquetes NuGet que usó el proyecto cuando utilizaba el .NET Framework completo.
Este es el contenido del archivo Packages.config . Observará que todos los paquetes NuGet tienen como destino Full .NET Framework 4.7.2:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Bogus" version="26.0.2" targetFramework="net472" /> <package id="LiteDB" version="4.1.4" targetFramework="net472" /> </packages>En el proyecto ContosoExpenses.Data , elimine el archivo Packages.config .
En el proyecto ContosoExpenses.Data, haga clic con el botón derecho en el nodo Dependencias y elija Administrar paquetes NuGet.
En la ventana del Administrador de paquetes NuGet , haga clic en Examinar. Busque el
Boguspaquete e instale la versión estable más reciente.del paquete NuGet
Bogus Busque el
LiteDBpaquete e instale la versión estable más reciente.del paquete NuGet
LiteDB Es posible que se pregunte dónde se almacena esta lista de paquetes NuGet, ya que el proyecto ya no tiene un archivo packages.config. Los paquetes NuGet a los que se hace referencia se almacenan directamente en el archivo .csproj. Para comprobarlo, vea el contenido del archivo de proyecto ContosoExpenses.Data.csproj en un editor de texto. Encontrará las siguientes líneas agregadas al final del archivo:
<ItemGroup> <PackageReference Include="Bogus" Version="26.0.2" /> <PackageReference Include="LiteDB" Version="4.1.4" /> </ItemGroup>Nota:
También puede observar que va a instalar los mismos paquetes para el proyecto de .NET Core 3 como los que se usan en los proyectos de .NET Framework 4.7.2. Los paquetes NuGet admiten varios destinos. Los autores de bibliotecas pueden incluir diferentes versiones de una biblioteca en el mismo paquete, compiladas para diferentes arquitecturas y plataformas. Estos paquetes admiten .NET Framework completo, así como .NET Standard 2.0, que es compatible con proyectos de .NET Core 3. Para obtener más información sobre las diferencias de .NET Framework, .NET Core y .NET Standard, consulte .NET Standard.
Para configurar los paquetes NuGet para el proyecto ContosoExpenses.Core:
En el proyecto ContosoExpenses.Core , abra el archivo packages.config . Observe que actualmente contiene las siguientes referencias que tienen como destino .NET Framework 4.7.2.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" /> <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" /> <package id="Unity" version="5.10.2" targetFramework="net472" /> </packages>En los pasos siguientes, usará las versiones de .NET Standard de los paquetes
MvvmLightLibsyUnity. Las otras dos son dependencias descargadas automáticamente por NuGet al instalar estas dos bibliotecas.En el proyecto ContosoExpenses.Core, elimine el archivo Packages.config.
Haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Administrar paquetes NuGet.
En la ventana del Administrador de paquetes NuGet , haga clic en Examinar. Busque el
Unitypaquete e instale la versión estable más reciente.
Busque el
MvvmLightLibsStd10paquete e instale la versión estable más reciente. Esta es la versión de .NET Standard delMvvmLightLibspaquete. Para este paquete, el autor eligió empaquetar la versión de .NET Standard de la biblioteca en un paquete independiente que la versión de .NET Framework.
En el proyecto de de
ContosoExpenses.Core, haga clic con el botón derecho en el nodo Dependencias de y elija Agregar referencia .En la categoría Projects > Solution, seleccione ContosoExpenses.Data y haga clic en Aceptar.
Deshabilitación de los atributos de ensamblado generados automáticamente
En este momento del proceso de migración, si intenta compilar el proyecto ContosoExpenses.Core , verá algunos errores.
Este problema se produce porque el nuevo formato .csproj introducido con .NET Core 3.0 almacena la información de ensamblado en el archivo del proyecto en lugar del archivo de AssemblyInfo.cs . Para corregir estos errores, deshabilite este comportamiento y deje que el proyecto siga usando el archivo AssemblyInfo.cs .
En Visual Studio, haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Descargar Proyecto. Vuelva a hacer clic con el botón derecho en el proyecto y elija Editar ContosoExpenses.Core.csproj.
Agregue el siguiente elemento en la sección PropertyGroup y guarde el archivo.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>Después de agregar este elemento, la sección PropertyGroup debería tener este aspecto:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>Haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Recargar Proyecto.
Haga clic con el botón derecho en el proyecto ContosoExpenses.Data y elija Descargar proyecto. Vuelva a hacer clic con el botón derecho en el proyecto y elija Editar ContosoExpenses.Data.csproj.
Agregue la misma entrada en la sección PropertyGroup y guarde el archivo.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>Después de agregar este elemento, la sección PropertyGroup debería tener este aspecto:
<PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>Haga clic con el botón derecho en el proyecto ContosoExpenses.Data y elija Recargar proyecto.
Agregar el paquete de compatibilidad de Windows
Si ahora intenta compilar los proyectos ContosoExpenses.Core y ContosoExpenses.Data , verá que los errores anteriores ahora se han corregido, pero todavía hay algunos errores en la biblioteca ContosoExpenses.Data similar a estos.
Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context
Estos errores son el resultado de convertir el proyecto ContosoExpenses.Data de una biblioteca de .NET Framework (específica para Windows) a una biblioteca de .NET Standard, que se puede ejecutar en varias plataformas, como Linux, Android, iOS, etc. El proyecto ContosoExpenses.Data contiene una clase denominada RegistryService, que interactúa con el registro, un concepto solo de Windows.
Para resolver estos errores, instale el paquete NuGet de compatibilidad de Windows . Este paquete proporciona compatibilidad con muchas API específicas de Windows que se usarán en una biblioteca de .NET Standard. La biblioteca ya no será multiplataforma después de usar este paquete, pero seguirá teniendo como destino .NET Standard.
Haga clic con el botón derecho en el proyecto ContosoExpenses.Data .
Seleccione Administrar paquetes NuGet.
En la ventana del Administrador de paquetes NuGet , haga clic en Examinar. Busque el
Microsoft.Windows.Compatibilitypaquete e instale la versión estable más reciente.
Ahora vuelva a intentar compilar el proyecto; para ello, haga clic con el botón derecho en el proyecto ContosoExpenses.Data y elija Compilar.
Esta vez el proceso de compilación se completará sin errores.
Probar y depurar la migración
Ahora que los proyectos se compilan correctamente, está listo para ejecutar y probar la aplicación para ver si hay errores en tiempo de ejecución.
Haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Establecer como proyecto de inicio.
Presione F5 para iniciar el proyecto ContosoExpenses.Core en el depurador. Verá una excepción similar a la siguiente.
Se genera esta excepción porque, al eliminar el contenido del archivo .csproj al principio de la migración, quitó la información sobre la acción de compilación de para los archivos de imagen. Los pasos siguientes corrigen este problema.
Detenga el depurador.
Haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Descargar proyecto. Vuelva a hacer clic con el botón derecho en el proyecto y elija Editar ContosoExpenses.Core.csproj.
Antes del elemento de cierre Project, agregue la siguiente entrada:
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>Haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Recargar Proyecto.
Para asignar el Contoso.ico a la aplicación, haga clic con el botón derecho en el proyecto ContosoExpenses.Core y elija Propiedades. En la página abierta, haga clic en la lista desplegable situada bajo "Icono" y seleccione
Images\contoso.ico.
Haz clic en Guardar.
Presione F5 para iniciar el proyecto ContosoExpenses.Core en el depurador. Confirme que la aplicación ahora se ejecuta.
Pasos siguientes
En este momento del tutorial, ha migrado correctamente la aplicación Contoso Expenses a .NET Core 3. Ya está listo para parte 2: Agregar un control InkCanvas para UWP mediante islas XAML.
Nota:
Si tienes una pantalla de alta resolución, puedes observar que la aplicación tiene un aspecto muy pequeño. Abordará este problema en el paso siguiente del tutorial.