¿Hay alguna forma de abrir y trabajar en el proyecto .net framework 4.5 en visual studio 2022 ?
Puede que el problema no sea con VS2022, pero como el paquete de desarrollador .NET .net framework 4.5 ya no está disponible... mi proyecto no se puede cambiar de versión de destino... ¿Hay alguna solución?
build\.NETFramework\v4.5\ a C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5Para obtener más detalles: creación de un proyecto destinado a .NET Framework 4.5 en Visual Studio 2022
Aquí hay una solución automatizada. Sigue los pasos en esta respuesta: https://stackoverflow.com/a/70109092/569302 Cuando copia los archivos, puede aparecer un cuadro de diálogo en el que debe hacer clic para reemplazar los archivos que ya existen.
( Nota: es posible que deba actualizar la "versión" "1.0.2" a lo que sea más reciente si hay un paquete NuGet más nuevo )
Ejecute await DevHelpers.Download();
using Microsoft.VisualBasic.FileIO; using System; using System.Collections.Generic; using System.IO.Compression; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace j.Dev { public class DevHelpers { public static async Task Download() { var version = "1.0.2"; var name = "Framework45-" + DateTimeToFileString(DateTime.Now); var fileName = $"{name}.zip"; var url = $"https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.net45/{version}"; await DownloadFile(fileName, url); ZipFile.ExtractToDirectory(fileName, name); var from = Path.Join(name, @"build\.NETFramework\v4.5\"); var to = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5"; FileSystem.CopyDirectory(from, to, UIOption.AllDialogs); } private static string DateTimeToFileString(DateTime d) { return d.ToString("yyyy-dd-M--HH-mm-ss"); } private static async Task DownloadFile(string fileName, string url) { var uri = new Uri(url); HttpClient client = new HttpClient(); var response = await client.GetAsync(uri); using (var fs = new FileStream( fileName, FileMode.CreateNew)) { await response.Content.CopyToAsync(fs); } } } }En mi caso, necesitaba descargar 4.0 Y 4.5, así que aquí está el código que descarga tanto 4.0 como 4.5:
using Microsoft.VisualBasic.FileIO; using System.IO.Compression; namespace j.Dev { /// <summary> /// Example Usage: await DevHelpers.DownloadAndCopyFramework4_0And4_5(); /// </summary> public class DevHelpers { public static async Task DownloadAndCopyFramework4_0And4_5() { await DownloadAndCopyFramework4_0(); await DownloadAndCopyFramework4_5(); } public static async Task DownloadAndCopyFramework4_5() { await DownloadAndCopyFrameworkGeneric("net45", "v4.5", "1.0.2"); } public static async Task DownloadAndCopyFramework4_0() { await DownloadAndCopyFrameworkGeneric("net40", "v4.0", "1.0.2"); } public static async Task DownloadAndCopyFrameworkGeneric(string netVersion, string folder, string nugetVersion) { var name = netVersion + "-" + DateTimeToFileString(DateTime.Now); var fileName = $"{name}.zip"; var url = $"https://www.nuget.org/api/v2/package/Microsoft.NETFramework.ReferenceAssemblies.{netVersion}/{nugetVersion}"; await DownloadFile(fileName, url); ZipFile.ExtractToDirectory(fileName, name); var from = Path.Join(name, @"build\.NETFramework\" + folder); var to = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\" + folder; FileSystem.CopyDirectory(from, to, UIOption.AllDialogs); } private static string DateTimeToFileString(DateTime d) { return d.ToString("yyyy-dd-M--HH-mm-ss"); } private static async Task DownloadFile(string fileName, string url) { var uri = new Uri(url); HttpClient client = new HttpClient(); var response = await client.GetAsync(uri); using (var fs = new FileStream( fileName, FileMode.CreateNew)) { await response.Content.CopyToAsync(fs); } } } }Para .NET 4.0, este comando lo instalará por usted si tiene los archivos de Visual Studio 2019 almacenados en caché:
msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.TargetingPack,version=4.0.30319.1\netfx_dtp.msi" EXTUI=1Para .NET 4.5, esto podría funcionar, aunque no lo he probado:
msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.5.2.TargetingPack,version=4.5.51651.1\netfx_452mtpack.msi" EXTUI=1Si bien todas las soluciones propuestas, e incluso las aceptadas, funcionarán, ninguna de ellas es el enfoque preferido .
Lo único que debe hacer es agregar una referencia al paquete NuGet de la siguiente manera:
<ItemGroup> <PackageReference Include="microsoft.netframework.referenceassemblies.net45" Version="1.0.2" PrivateAssets="All" /> </ItemGroup> Puede realizar este cambio directamente en *.csproj o a través de la interfaz de usuario del Administrador de paquetes en Visual Studio. Las extensiones de MSBuild en el paquete se encargarán del resto de la magia . No hay scripts para escribir, archivos para copiar o permisos para otorgar. Esto funcionará sin elevación, que sería necesario escribir en %PROGRAMFILES% .
Establecer PrivateAssets="All" hará que el paquete haga referencia solo en tiempo de diseño. No se seleccionará ni incluirá como una dependencia transitiva si su destino también crea un paquete NuGet.
Roslyn Problema 56161: Quitar el requisito del paquete de orientación de .NET 4.5 confirma además que esta es la forma en que se usan los ensamblajes de referencia cuando no está instalado un paquete de orientación. Este enfoque es útil cuando no desea instalar un paquete de orientación o no está disponible, por ejemplo, en un servidor de compilación sin Visual Studio.
Me encontré con el mismo problema después de desinstalar Visual Studio 2019. La compilación funcionó como se esperaba desde Visual Studio y la CLI después de agregar esta referencia de paquete.