web-dev-qa-db-fra.com

Recibler tous les projets d'une solution vers .NET 4.5.2

J'ai une solution dans Visual Studio 2012 avec 170 projets C #. Je dois 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 modifications incluent l'ajout de quelques nouvelles balises XML au .csproj, en fonction de certains attributs du projet en cours.

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

79
Kyle V.

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

Cependant, il existe une extension (bien cotée) appelée Target Framework Migrator disponible dans la galerie Visual Studio, qui prend en charge la mise à niveau vers la version 4.5.2 (ainsi que les nouvelles versions **) et fais exactement ce que tu veux. 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 simplement une omission). Je ne fais que deviner, mais peut-être que MS indique uniquement les projets pour lesquels a besoin du nouveau cadre de travail mis à niveau. FWIW, si vous finissez par mettre à niveau certains projets partagés avec d’autres solutions, ces solutions risquent de ne pas être générées tant que elles ne seront pas mises à niveau .

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


** Il n'y a pas eu beaucoup de développement ces derniers temps. Si vous ne parvenez pas à le faire fonctionner avec une version plus récente du .NET Framework, recherchez les correctifs existants PRs et Problèmes . Par exemple, quelqu'un a posté un correctif pour .NET Framework v 4.7.1 . Espérons que ceux-ci seront finalement fusionnés.

73
Grant

J'ai moi-même construit un outil simple pour migrer les versions de l'infrastructure cible pour une solution complète, car l'extension du cadre de migration cible ne prend pas en charge Visual Studio 2017. Téléchargez l'outil à partir de mon référentiel GitHub https://github.com/ Xpitfire/TargetFrameworkMigrator

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

Puisque le Target Framework Migrator est cassé, j'ai lancé ma propre recherche/remplacement (avec git bash, cela fonctionne correctement sous Windows); Fondamentalement, il modifie le v4.6.x en v4.7.2, puis il reconvertit les fichiers en utilisant le CRLF infâme 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
3
JB.

Pour une solution .NET Framework, un simple " Remplacer dans des fichiers " a été décisif pour moi:

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

Dans les fichiers package.config, remplacez tous

targetFramework="net452" 

à

targetFramework="net472" 

Dans les fichiers *. Csproj, remplacez tous les fichiers.

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

à

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
1
webpat
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();
}
0
MaxR