73
votes

Open .NET Framework 4.5 Projet dans vs 2022. Y a-t-il une solution de contournement?

y a-t-il de toute façon pour ouvrir et travailler sur .NET Framework 4.5 Projet dans Visual Studio 2022 .

peut être que le problème n'est pas avec VS2022, mais comme .NET Framework 4.5 Le pack de développeurs n'est plus disponible .. mon projet ne peut pas être modifié la version cible .. y a-t-il une solution de contournement?

 Entrez la description de l'image ici Entrez la description de l'image ici


3 commentaires

Mise à niveau. .NET Framework 4.5 a disparu il y a des années. La première version prise en charge est de 4.5.2, mais même cela est hors de soutien dans quelques mois. La version prise en charge la plus basse sera de 4,6.2


Voir: thomaslevesque.com/2021/11/12/…


Sujet important. J'ai trouvé la réponse acceptée bien, mais j'ai toujours obtenu 4.5.1 de la capture d'écran ci-dessus. Et passera bientôt à la mise à niveau par ex. 4.8 À prendre en charge et à l'épreuve du temps.


6 Réponses :


162
votes
  • Télécharger Microsoft.netframework.referenceSemblies.net45 De Nuget.org.org
  • Ouvrez le package comme zip
  • Copiez les fichiers de build \ .netframework \ v4.5 \ à C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ framework \ .netframework \ v4.5 < / code>

Pour plus de détails: Construire un projet qui cible .NET Framework 4.5 dans Visual Studio 2022


13 commentaires

omg C'était aussi simple que cela !! J'ai passé le lien mais j'ai raté le point de téléchargement du package .. Merci pour la simplification étape par étape ... ça marche maintenant


J'ai automatisé les étapes de cette réponse: stackoverflow.com/a/70398706/569302


Cela fonctionne également lorsque vous ciblez .NET 4.0, téléchargez simplement le package NUGET .NET40 et copiez des fichiers dans le dossier \ .netframework \ v4.0. Redémarrez vs ouvrez ensuite le projet et cela fonctionne très bien.


Remarque : Après avoir téléchargé, vous devez renommer le nom de fichier de .nupkg à .zip que le reste du processus est comme mentionné dans ce réponse. Peut-être qu'il est connu du maximum d'entre vous, mais cela pourrait économiser des heures pour quelqu'un comme moi. C'est pourquoi mettre le commentaire ici.


Cela ne fonctionne pas pour .net 3.5


N'oubliez pas de fermer et de rouvrir Visual Studio après cela, car le changement ne prend pas automatiquement effet.


Cela fonctionne également pour .NET Framework 4.5.1 et pour toute autre version. Obtenez simplement le package NuGet pour la version de .NET Framework dont vous avez besoin, et dézip et copiez les fichiers dans le dossier correspondant sur votre PC


Même si vous avez déjà un dossier V4.5, déplacez ces fichiers vers un nouveau dossier _BK et collez les fichiers dans le dossier V4.5. Fonctionne parfaitement. Merci!


Bien que ce soit la réponse acceptée , c'est honnêtement la manière dure . La seule chose et que vous devez faire est de référencer le package NuGet approprié. Vous faites pas avez besoin de télécharger explicitement, de l'extraire ou d'écrire un code pour qu'il fonctionne. Il fonctionnera avec tout projet qui prend en charge NuGet ou packages.config . Le problème avec cette approche est qu'il nécessite une élévation pour écrire dans un répertoire protégé, peut ne pas fonctionner sur un serveur de construction et n'est pas adapté à l'équipe. Le package a des cibles MSBuild qui magiquement relie tout.


@Chrismartinez vraiment? L'OP a clairement un problème pour charger le projet en premier lieu ainsi que la plupart de ceux qui viennent ici pour la réponse. Le chargement d'un package NuGet dans le projet peut donc ne pas être la bonne solution pour la situation ici.


@ CME64 Oui, vraiment. Le projet ne se charge pas car le pack de ciblage .NET nécessaire n'a pas été trouvé. Le package NuGet Assemblages de référence comprend tous les fichiers nécessaires du pack de ciblage et remplace les propriétés et cibles MSBuild pour utiliser l'emplacement du fichier NuGet au lieu d'un emplacement installé. J'ai élargi ma réponse avec des détails supplémentaires, des images, etc. ainsi qu'un lien vers un Gist de travail.


Cela a fonctionné pour moi, assez facile


Des informations qui sauvent des vies! Merci! :)



4
votes

Voici une solution automatisée. Il suit les étapes de cette réponse: https://stackoverflow.com/a/70109092/569302 lorsque cela copie les fichiers, les dossiers Une boîte de dialogue peut sembler que vous devez cliquer pour remplacer les fichiers qui existent déjà

( note: vous devrez peut-être mettre à jour la "version" "1.0.2" Il y a un plus récent package nuget )

Exécuter attendre Devhelpers.Download ();

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);
            }
        }
    }
}

Dans mon cas, je devais télécharger 4.0 et 4.5, alors voici le code qui Télécharges à la fois 4.0 et 4.5:

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);
            }
        }
    }
}


6 commentaires

Merci pour le script. Je voulais à la fois 4.0 et 4.5 car j'ai d'anciens projets pour la bibliothèque de classe et l'application WinForm. Une question: le "var version =" 1.0.2 " ou (" netx0 "," vx.0 "," 1.0.2 ") Dernière à partir d'aujourd'hui (même si la version framework dans l'ancienne)?


"Merci pour le script." De rien!!!


"Le" var version = "1.0.2" ou ("netx0", "vx.0", "1.0.2") compte "si je comprends correctement: j'ai fourni deux solutions de code. Peu importe si vous Utilisez le premier ( var version = "1.0.2" ) ou le second ( ("net45", "v4.5", "1.0.2") ). J'ai fourni les deux parce que le premier répond à la question sur ce site précisément et que le second peut être utile à d'autres qui recherchent sur Google.


"Est-ce plus récent à partir d'aujourd'hui (même si la version framework dans ancienne)" à ce jour, c'est le package NuGet le plus récent sur ce site: nuget.org/packages/… Si vous cliquez sur" Versions ", vous pouvez voir le dernier (Capture d'écran du site Web NuGet: ibb.co/pc43zg5 ). Une amélioration du code que j'ai écrit est de vérifier ce site Web NuGet (ou de faire quelque chose) pour voir s'il y a une nouvelle version du package NuGet


@ Deathgod7 Voir les commentaires ci-dessus


Merci encore. J'allais presque pour mettre à jour la version d'assemblage quand j'ai vu 4.0 et 4.5 avaient disparu en VS2022. Ensuite, j'ai vu votre réponse et c'est bien maintenant.



3
votes

Pour .NET 4.0, cette commande l'installera pour vous si vous avez les fichiers Visual Studio 2019 mis en cache:

msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.5.2.TargetingPack,version=4.5.51651.1\netfx_452mtpack.msi" EXTUI=1

pour .net 4.5, cela pourrait fonctionner, bien que je ne l'ai pas fait J'ai essayé:

msiexec.exe /i "%ALLUSERSPROFILE%\Microsoft\VisualStudio\Packages\Microsoft.Net.4.TargetingPack,version=4.0.30319.1\netfx_dtp.msi" EXTUI=1


1 commentaires

Merci beaucoup, vous m'avez sauvé, c'est le moyen idéal. Remarque Le paramètre "extui = 1" est important.



6
votes

Alors que toutes les solutions proposées, et même les solutions acceptées, aucun d'entre eux n'est l'approche préférée .

La seule chose que vous devez faire est d'ajouter une référence à la Nuget package comme suit:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net40" Version="1.0.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
</Project>

Figure 1: C # Projet ciblant .NET Framework 4.0 via des assemblages de référence

Vous pouvez le faire Changer directement dans le *. CSPROJ ou via l'interface utilisateur Package Manager dans Visual Studio. Les extensions MSBuild dans le package prendront en charge le reste de la magie . Il n'y a pas de scripts à écrire, de fichiers à copier ou d'autorisations à accorder. Cela fonctionnera sans élévation, qui serait obligé d'écrire sous % ProgramFiles% .

Setting privateSsets = "all" fera la conception de référence du package de conception de référence du package -Time seulement. Il ne sera pas ramassé ou inclus comme dépendance transitive si votre cible construit également un package NuGet.

. Console net 4.0 dans vs2022

Em> Figure 2: Ciblage du projet .NET Framework 4.0 dans le Visual Studio 2022 Solution Explorer

roslyn Problème 56161: supprimer .NET 4.5 Exigence du pack de ciblage confirme en outre que la façon dont vous utilisez des assemblages de référence lorsqu'un pack de ciblage n'est pas installé. Cette approche est utile chaque fois que vous ne souhaitez pas installer un pack de ciblage ou il n'est pas disponible par ailleurs - par exemple sur un serveur de construction sans Visual Studio.

La preuve

. net. Packs de ciblage

Figure 3: Packs de ciblage .NET plus anciens non installés ou disponibles

J'ai rencontré le même problème après la désinstallation visuelle visuelle Studio 2019. La construction a fonctionné comme prévu de Visual Studio et de la CLI après avoir ajouté cette référence de package.

Exemple

  • Téléchargez les fichiers à partir de la .net 4.0 console en utilisant vs2022 gist to n'importe quel dossier li>
  • Ouvrez une invite de développeur et accédez au dossier cible
  • EXÉCUTE DOTNET Restore
  • Ouvrez le projet dans Visual Studio 2022
  • Construisez et exécutez le projet
  • Informations supplémentaires

    • La construction à partir de la ligne de commande avec dotnet ou msbuild doit être une erreur et un avertissement gratuit
    • Vous faites pas devez installer la version cible .NET Framework pour la construire, mais vous le faites pour l'exécuter; y compris les tests unitaires
    • vous pouvez devez exécuter nettoyer et / ou supprimer manuellement bin , obj , et éventuellement .vs pour effacer les avertissements initiaux de Visual Studio
    • vous peut devez effectuer une restauration NuGet explicite (ex: dotnet restauration ) pour effacer les avertissements initiaux de Visual Studio
    • Visual Studio semble exiger que le framework .NET cible soit installé
    • L'exemple cible affiché .NET Framework 4.0 avec .NET Framework 4.8 installé
    • Cibler .NET Framework 2.0 ou 3.5 compilé via la ligne de commande, mais pas Visual Studio, probablement parce que je ne les ai pas installés
    • Si Visual Studio vous donne toujours du chagrin:
      • Ajoutez au moins un surnom de framework cible pris en charge (ex: net48 )
      • Utilisez le code Visual Studio (je préfère complet vs, mais c'est une option)


    5 commentaires

    Question. Que se passe-t-il si l'application Web en question ne contient pas réellement de fichier CSPROJ? Sûrement, si vous ne pouvez pas ouvrir le projet pour utiliser l'interface utilisateur du gestionnaire de packages; t'es foutu?


    La question d'origine indiquait C # et, par conséquent, *. CSPROJ . Cette approche fonctionnera cependant pour tout projet msbuild que ce soit *. VBProj ou une vanille *. Proj . En fin de compte, vous avez juste besoin de support NuGet. Si vous utilisez un ancien système de projet ou si vous n'avez aucun fichier de projet, vous pouvez utiliser la CLI NuGet (par exemple nuget.exe ) avec packages.config à < I> Installez le package localement. Si vous compilez le code .NET avec une application Web, MSBuild doit être impliqué quelque part parce que c'est ainsi que le compilateur est intégré. Package de connexion *. Targets à votre application permettra le magie .


    Je souhaite que cette réponse soit acceptée.


    Je n'ai pas fonctionné pour moi, donc pas aussi facile que vous le dites. Donne toujours l'erreur de chargement et n'ouvrira pas le projet après avoir ajouté ces lignes au CSPROJ.


    @Brentkilboy, vous n'avez pas besoin de modifier le projet à la main, sauf si vous le souhaitez. Je n'ai pas assez de contexte. Si vous avez un GIST, un repo ou un contexte supplémentaire, je suis heureux d'élaborer. C'est est la façon officielle de pour qu'elle soit effectuée. Il est également possible que votre état de construction soit sale. Il peut être la peine d'être effacé bin et obj , puis une reconstruction de projet.



    2
    votes

    Une autre façon d'installer plusieurs packs de ciblage plus anciens est d'installer Visual Studio 2019.

    Remarque: il les supprimera à nouveau si vous désinstallez vs2019, alors prenez une copie de celles que vous voulez et collez-les par la suite.

     Entrez la description de l'image ici


    0 commentaires

    0
    votes

    à partir des commentaires sur l'article lié à partir de la réponse sur la copie des fichiers: "installer" Windows 8 SDK ". Et il peut simplement installer" .NET Framework 4.5 Software Development Kit ". Aucun autre bagage."

    Cette option a été la plus rapide pour moi, car je peux exécuter un installateur élevé plus facilement que de passer à l'élevage pour écrire dans les dossiers des fichiers du programme.

     Entrez la description de l'image ici


    0 commentaires