Reciblage de tous les projets d'une solution vers .NET 4.5.2

96

J'ai une solution dans Visual Studio 2012 avec 170 projets C #. J'ai besoin de recibler tous les projets de .NET Framework 4.0 à 4.5.2.

Je préfère laisser Visual Studio gérer cela en accédant aux propriétés de chaque projet, en modifiant le framework ciblé et en laissant Visual Studio apporter les modifications nécessaires aux fichiers .csproj.

J'ai remarqué que ces changements incluent l'ajout de quelques nouvelles balises XML au .csproj, en fonction de certains attributs du projet actuel.

Comment puis-je recibler par lots les 170 projets C # sans simplement utiliser un outil de remplacement de texte pour remplacer le numéro de version ciblé? Je veux que Visual Studio effectue toutes les modifications et ajouts de balises nécessaires et que le remplacement seul ne permettra pas que cela se produise.

Kyle V.
la source
Je ne connais aucun moyen de le faire automatiquement. Je pense que votre meilleur pari serait un enregistreur de macros Windows standard, que vous utilisez des commandes au clavier. Mais, je les exécuterais un par un plutôt que d'essayer de les regrouper ensemble car il peut être difficile d'identifier quand VS a terminé son travail dans tous les cas.
Erik Funkenbusch
1
Non, vous ne devriez pas faire cela. Surtout pas 4.5.2, il n'a pas de nouveaux types utiles et il est peu probable qu'il soit couvert par les futurs packs multi-ciblage. Tout comme 4.0x ne l'était pas. Faites-le un projet à la fois et seulement ceux qui en ont besoin. Ceux dans lesquels vous souhaitez réellement ajouter un nouvel assembly de référence et modifier le code pour les utiliser. Si vous souhaitez ignorer ce conseil, vous le faites probablement, puis utilisez Edition> Rechercher et remplacer> Remplacer dans les fichiers pour remplacer l'élément TargetFrameworkVersion dans les fichiers * .csproj. Assurez-vous que votre contrôle de source est solide.
Hans Passant
1
@HansPassant Votre solution de Find / Replace est exactement ce que je ne voulais pas faire selon ma question. J'ai besoin d'une solution plus robuste.
Kyle V.
@GrantWinney Je / sais / cela ne fonctionnera pas car j'ai déjà essayé Find / Replace et si vous utilisez cette méthode, les modifications .csproj supplémentaires que Visual Studio aurait apportées autrement ne sont pas implémentées.
Kyle V.
1
@GrantWinney l'extension Target Framework Migrator fait exactement ce que je voulais. Si vous pouvez créer une réponse, je la marquerai comme correcte. Merci!
Kyle V.

Réponses:

84

La documentation MSDN « Guide de migration vers .NET Framework 4.5 » et « Comment configurer une application pour prendre en charge .NET Framework 4 ou 4.5 » traite uniquement de la modification de projets. Il n'y a pas de détails sur l'application des modifications à l'ensemble de la solution à la fois, et je n'ai pas non plus vu de fonction dans VS qui le prend en charge.

Cependant, il existe une extension (bien notée) appelée Target Framework Migrator disponible dans la galerie Visual Studio, qui prend en charge la mise à niveau vers la 4.5.2 (ainsi que les versions plus récentes **) et semble faire exactement ce que vous voulez. Le code source est disponible sur GitHub , si cela vous intéresse.

Notez que l'absence d'une telle fonctionnalité peut être intentionnelle (et pas seulement une omission). Je ne fais que deviner, mais peut-être que MS pense que seuls les projets qui ont besoin des nouveaux Frameworks seront mis à niveau. FWIW, si vous finissez par mettre à niveau certains projets partagés avec d'autres solutions, ces solutions peuvent échouer jusqu'à ce qu'elles soient également mises à niveau.

Cela étant dit, si vous êtes dans un petit magasin avec une seule (ou quelques) solutions et que vous cherchez à tout mettre à niveau en une seule fois, alors peut-être que l'outil ci-dessus fonctionnera pour vous.


Il n'y a eu aucun développement à ce sujet depuis des années , et apparemment le développeur n'a pas l'intention de passer le relais à qui que ce soit.

Si vous ne parvenez pas à le faire fonctionner avec une version plus récente de .NET Framework, recherchez des correctifs dans les PR et problèmes existants , mais vous devrez peut-être les appliquer vous-même. Par exemple, quelqu'un a publié un correctif pour .NET Framework v 4.7.1 . J'espère que ceux-ci seront fusionnés, mais je ne retiendrais pas mon souffle.

Si quelqu'un d'autre voit la même erreur qu'Anas (dans les commentaires), voici un problème GitHub d'il y a quelques semaines, et un autre problème éventuellement lié de 2017. Pensez à les augmenter et à ajouter plus de détails si vous rencontrez le même problème .

poissons vivat
la source
7
L'outil «target framework migrator» échoue sur la dernière mise à jour 15.5.5 de VS 2017, «paramètre non valide»
Anas Ghanem
1
A travaillé pour moi aujourd'hui avec VS2017 15,7 au cadre 4.7
Tod
Je doute fort que MS omette intentionnellement des fonctionnalités pour le bénéfice des utilisateurs ... il est fort probable que ce soit juste quelque chose d'autre auquel ils n'ont pas pensé ou qu'ils n'ont pas à prendre en charge ... le transmettre à la communauté ..
PJUK
1
@Grant J'ai ajouté un commentaire au problème existant. En fait, j'ai fait le travail avec une recherche find / sed et un remplacement dans le projet et les fichiers de configuration.
JB. Avec Monica.
2
Le développeur a passé le relais en décembre 2019, vous pouvez à nouveau modifier votre (bonne) réponse :)
Ludovic Feltz le
12

Pour une solution .NET Framework, un simple " Remplacer dans les fichiers " a fait l'affaire pour moi:

Par exemple : de .NET Framework 4.5.2 à .NET Framework 4.7.2

Dans les fichiers package.config , remplacez tout

targetFramework="net452" 

à

targetFramework="net472" 

Dans les fichiers * .csproj , remplacez tout

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

à

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
webpat
la source
1
Dans VS 2019, «remplacer tout» ne fonctionne pas vraiment. Vous devez utiliser à plusieurs reprises "trouver suivant". C'est mon dernier projet de développement basé sur Microsoft. Je passe à MacOSX où il y a une cohérence et un niveau décent d'assurance qualité sur leurs produits.
ATL_DEV
1
La modification de targetFramework dans packages.config ne réinstalle pas le package pour ce framework, vous pouvez donc toujours vous retrouver avec la mauvaise version. Vous devrez réinstaller le package, ou au moins supprimer votre dossier packages et restaurer la bonne version du package. Le problème est qu'avec cet ancien modèle packages.config, sans réinstaller, vos références de DLL pour le package cibleront la mauvaise DLL dans le mauvais sous-répertoire du package.
Triynko le
3
Wow, a fini par revenir à cette question après les vacances et a également vu le besoin de commenter cette même réponse, haha. J'ajouterai que les fichiers * .csproj et packages.config ne sont pas les seuls à faire référence au framework cible. Il existe également des références dans les fichiers web.config dans diverses sections. Par exemple, sous system.web, les balises compilation et httpRuntime ont un attribut targetFramework qui aurait besoin d'être mis à jour. Donc, ce processus manuel de recherche et de remplacement semble être une idée vraiment terrible qui pourrait laisser vos projets dans un état incohérent et corrompu.
Triynko le
9

Puisque le Migrator de Target Framework est cassé, j'ai lancé ma propre recherche / remplacement (en utilisant git bash, cela fonctionne bien sur Windows); Fondamentalement, il change le v4.6.x en v4.7.2 , puis il convertit les fichiers en utilisant le fameux CRLF du DOS:

find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.6\..' \{} \; | xargs -0 sed -i 's/v4\.6\../v4.7.2/'  
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.7\..' \{} \; | xargs -0 unix2dos
JB. Avec Monica.
la source
4
J'ai trouvé ceci, et puis Update-Package -ReInstallfaire des merveilles. Merci!
askrich
1
Cela a parfaitement fonctionné pour moi. Merci pour cette solution
Maryam
Pour une version
PowerShell,
7

Je me suis construit un outil simple pour migrer les versions du framework cible pour une solution entière, car l'extension Target Framework Migrator ne prend pas en charge Visual Studio 2017. Téléchargez l'outil depuis mon référentiel GitHub https://github.com/Xpitfire/TargetFrameworkMigrator

Je sais que ce n'est pas la meilleure façon de procéder, mais cela a fonctionné pour moi et peut-être que cela aidera aussi quelqu'un d'autre.

Marius-Constantin Dinu
la source
C'est maintenant sûr.
Jay Croghan
3

Target Framework Migrator est très utile. Par défaut, il s'agit de la v4.7. Cependant, il est facile d'ajouter la prise en charge des v4.7.1, v4.7.2 et v4.8.

Recherchez le fichier Frameworks.xml dans le dossier C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ et modifiez-le en ajoutant ces versions de framework:

<Framework Id="262152" Name=".NETFramework,Version=v4.8"/>
<Framework Id="262663" Name=".NETFramework,Version=v4.7.2"/>
<Framework Id="262407" Name=".NETFramework,Version=v4.7.1"/>

Après avoir redémarré Visual Studio, vous verrez de nouvelles versions.

Doğa Benli
la source
3
Il existe un fork avec une version compatible VS2019 qui est déjà mis à jour sur github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS
Merci beaucoup! C'était une solution de contournement très agréable et facile!
fusion
2
public void ChangeFramework() {

  //Add Reference to envdte (Assemblies\Extensions\envDTE)
  string SolutionFile = @"C:\MyProject\MyProject.sln";
  string ProjectName = "MyProject";

  //------------------------------------------------------------------------
  //Find the Program ID from the registry for VisualStudio.DTE
  //Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes
  System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
  EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);

  //------------------------------------------------------------------------
  //Open your Solution
  dte.Solution.Open(SolutionFile);

  //------------------------------------------------------------------------
  //Now In your solution go through what is listed in dte.Solution.Projects 
  //and find the one that match what you want to change target for
  int iItemsCount = dte.Solution.Projects.Count;
  string sCurrent = "";

  for (int i = 1; i <= iItemsCount; i++) {

    sCurrent = dte.Solution.Projects.Item(i).Name;

    if (dte.Solution.Projects.Item(i).Name == ProjectName) {
      //Once you find your project, Change the Framework
      EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
      oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
    }
  }

  //------------------------------------------------------------------------
  //Close your Solution
  dte.Solution.Close();
}
MaxR
la source