Desde que he estado trabajando con la comunidad para portar aplicaciones de escritorio de .NET Framework a .NET Core, he notado que hay dos campos de personas: algunos quieren una lista muy simple y corta de instrucciones para que sus aplicaciones sean portadas .NET Core, mientras que otros prefieren un enfoque más basado en principios con más información de fondo. En lugar de escribir un documento de "navaja suiza", publicaremos dos publicaciones de blog, una para cada campamento:
- Esta publicación es el caso simple . Se centra en instrucciones simples y aplicaciones más pequeñas y es la forma más fácil de mover su aplicación a .NET Core.
- Publicaremos otra publicación para casos más complicados . Esta publicación se centrará más en aplicaciones no triviales, como la aplicación WPF con dependencias en WCF y paquetes de interfaz de usuario de terceros.
Si prefiere ver videos en lugar de leer, aquí está el video donde hago todo lo que se describe a continuación.
Paso 0: requisitos previos
Para portar sus aplicaciones de escritorio a Core, necesitará .NET Core 3 y Visual Studio 2019.
Paso 1 - Ejecute el analizador de portabilidad
Antes de portar, debe verificar qué tan compatible es su aplicación con .NET Core. Para hacerlo, descargue y ejecute .NET Portability Analyzer .
- En la primera pestaña, Resumen de portabilidad, si solo tiene el 100% en la columna .NET Core (todo está resaltado en verde), su código es totalmente compatible, vaya al Paso 2.
- Si tiene valores inferiores al 100%, primero mire todos los ensamblajes que no forman parte de su aplicación. Para aquellos, verifique si sus autores están proporcionando versiones para .NET Core o .NET Standard.
- Ahora mire la otra parte de los ensambles que provienen de su código. Si no tiene ninguno de sus ensamblajes enumerados en el informe de portabilidad, vaya al Paso 2. Si lo tiene, abra la pestaña Detalles, filtre la tabla haciendo clic en la columna Ensamblaje y céntrese solo en los de su aplicación. Recorre la lista y refactoriza tu código para dejar de usar la API o reemplaza el uso de la API con alternativas de .NET Core.

Paso 2: migra a .csproj al estilo SDK
En el Explorador de soluciones , haga clic con el botón derecho en su proyecto (¡no en la solución!). ¿Ves Editar archivo de proyecto ? Si lo hace, ya usa el archivo de proyecto de estilo SDK, por lo que debe pasar al Paso 3 . Si no, haga lo siguiente.
- Compruebe en el Explorador de soluciones si su proyecto contiene un archivo
packages.config
. Si no lo hace, no se necesita ninguna acción; si lo hace, haga clic con el botón derecho en packages.config
y elija Migrar paquetes.config a PackageReference . Luego haga clic en Aceptar . - Abra su archivo de proyecto haciendo clic derecho en el proyecto y elija Descargar proyecto . Luego haga clic derecho en el proyecto y elija Editar <nombre del proyecto> .csproj .
- Copie el contenido del archivo del proyecto en algún lugar, por ejemplo, en el Bloc de notas, para que pueda buscarlo más tarde.
- Elimine todo del archivo de proyecto abierto en Visual Studio (sé que suena agresivo, pero agregaremos solo el contenido necesario de la copia que acabamos de hacer en unos pocos pasos). En lugar del texto que acaba de eliminar, pegue el siguiente código. Para una aplicación WinForms:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project>
Para una aplicación WPF:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project>
- En el Bloc de notas, busque
PackageReference
. Si no encontraste nada, sigue adelante. Si encontró PackageReference
, copie todo el <ItemGroup>
que contiene PackageReference
en su archivo de proyecto, abierto en Visual Studio, justo debajo de las líneas que ha pegado en el paso anterior. Hágalo para cada aparición de PackageReference
que haya encontrado. El bloque copiado debería verse así.
<ItemGroup> <PackageReference Include="NUnit"> <Version>3.11.0</Version> </PackageReference> </ItemGroup>
- Ahora haga lo mismo que anteriormente para
ProjectReference
. Si no encontraste nada, sigue adelante. Si encontrara algún elemento de ProjectReference
, se vería así.
<ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj"> <Project>{7bce0d50-17fe-4fda-b6b7-e7960aed8ac2}</Project> <Name>WindowsFormsApp1</Name> </ProjectReference> </ItemGroup>
- Puede eliminar líneas con las propiedades
<Project>
y <Name>
, ya que no son necesarias en el nuevo estilo de archivo de proyecto. Entonces, para cada ProjectReference
que haya encontrado (si corresponde), copie solo ItemGroup
y ProjectReference
esta manera.
<ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj" /> </ItemGroup>
Guarda todo. Cierre el archivo .csproj en Visual Studio. Haga clic con el botón derecho en su proyecto en el Explorador de soluciones y seleccione Volver a cargar proyecto . Reconstruya y asegúrese de que no haya errores.
¡Buenas noticias, acabas de actualizar tu archivo de proyecto al nuevo estilo SDK! El proyecto todavía está dirigido a .NET Framework, pero ahora podrá reorientarlo a .NET Core.
Paso 3: reorientar a .NET Core
Abra su archivo de proyecto haciendo doble clic en su proyecto en el Explorador de soluciones . Busque la propiedad <TargetFramework>
y cambie el valor a netcoreapp3.0
. Ahora su archivo de proyecto debería verse así:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> ... </PropertyGroup> ... </Project>
Construye y ejecuta tu proyecto. ¡Enhorabuena, has portado a .NET Core 3!
Errores de reparacion
Si obtienes errores como
The type or namespace <some name> could not be found
o
The name <some name> does not exist in the current context
y su informe de portabilidad era verde, debería ser fácil de solucionar agregando un paquete NuGet con la biblioteca correspondiente. Si no puede encontrar el paquete NuGet con la biblioteca que falta, intente hacer referencia a Microsoft.Windows.Compatibility . Este paquete agrega ~ 21K API .NET de .NET Framework.
Trabajando con diseñadores
Aunque es posible editar la interfaz de usuario de su aplicación a través del código, los desarrolladores generalmente prefieren usar los diseñadores visuales. Con .NET Core tuvimos que volver a diseñar la forma en que los diseñadores trabajan con los proyectos .NET Core:
- El diseñador de WPF ya está en la vista previa y estamos trabajando para agregarle más funcionalidades.
- El diseñador WinForms para .NET Core estará disponible más adelante, y mientras tanto, puede usar el diseñador WinForms de .NET Framework como solución alternativa.
A continuación, le mostramos cómo puede usar el diseñador WinForms de .NET Framework:
- Copie su archivo .csproj (supongamos que tiene
MyProject.csproj
), asígnele un nombre diferente, por ejemplo MyProject.NetFramework.csproj
y MyProject.NetFramework.csproj
junto a su archivo de proyecto existente. - Asegúrese de que su proyecto esté cerrado en Visual Studio, abra el nuevo proyecto
MyProject.NetFramework.csproj
.
En el Explorador de soluciones , haga clic con el botón derecho en su proyecto y seleccione Propiedades . En la pestaña Aplicación (debe estar abierta de forma predeterminada) configure el Nombre de ensamblado y el Espacio de nombres predeterminado con los mismos valores que en su proyecto inicial (elimine ".NetFramework" de los nombres).
Guarde esta solución junto a su solución existente. - Abra el nuevo archivo de proyecto y cambie
<TargetFramework>
a net472
. - Ahora, cuando necesite usar el diseñador WinForms, cargue su proyecto con el archivo de proyecto
MyProject.NetFramework.csproj
y obtendrá la experiencia completa del diseñador .NET Framework. Cuando haya terminado con el diseñador, cierre y abra su proyecto con el archivo de proyecto .NET Core. - Esto es solo una solución hasta que el diseñador de WinForms para .NET Core esté listo.
Por qué portar a .NET Core
Mira el video donde Scott Hunter y yo estamos hablando de todas las cosas nuevas que vienen con .NET Core 3 Porting a .NET Core 3.0 .