Подтвердить что ты не робот

Перенастройка всех проектов в решение .NET 4.5.2

У меня есть решение в Visual Studio 2012 с 170 С# проектами в нем. Мне нужно перенастроить все проекты с .NET Framework 4.0 до 4.5.2.

Я предпочитаю, чтобы Visual Studio справилась с этим, перейдя в свойства каждого проекта, изменив целевую структуру и позволив Visual Studio внести необходимые изменения в файлы .csproj.

Я заметил, что эти изменения включают добавление нескольких новых тегов XML в .csproj, в зависимости от некоторых атрибутов текущего проекта.

Как я могу перезагрузить все 170 проектов С# без использования инструмента для замены текста, чтобы заменить номер целевой версии? Я хочу, чтобы Visual Studio делала все необходимые изменения и дополнения к тегам и их замену не позволяла это делать.

4b9b3361

Ответ 1

В документации MSDN "Руководство по миграции на .NET Framework 4.5" и "Как настроить приложение для поддержки .NET Framework 4 или 4.5" обсуждаются только изменения проектов. Там нет никаких деталей о применении изменений ко всему решению сразу, и я не видел функцию в VS, которая поддерживает его.

Тем не менее, в галерее Visual Studio доступно расширение с хорошим рейтингом Target Framework Migrator, которое поддерживает обновление до 4.5.2 (а также более новые версии **) и выглядит так, как будто оно подойдет именно то, что вы хотите. Исходный код доступен на GitHub, если вам интересно.

Обратите внимание, что отсутствие такой функции может быть преднамеренным (а не просто упущением). Я просто догадываюсь, но, возможно, MS полагает, что только проекты, которые нуждаются в новых Frameworks, будут модернизированы. FWIW, если вы закончите обновление некоторых проектов, которые используются совместно с другими решениями, эти решения могут не сработать, пока они тоже не будут обновлены.

При этом, если вы находитесь в небольшом магазине с одним (или несколькими) решениями и хотите обновить все за один раз, возможно, вышеуказанный инструмент подойдет вам.


В течение многих лет не было никаких разработок по этому вопросу, и, очевидно, разработчик не планирует передавать эстафету кому-либо еще.

Если вы не можете заставить его работать с более новой версией .NET Framework, проверьте существующие PR и Проблемы на наличие исправлений, но вам, возможно, придется применить их самостоятельно. Например, кто-то опубликовал исправление для .NET Framework v 4.7.1. Надеюсь, они будут объединены, но я не задерживаю дыхание.

Если кто-то еще видит ту же ошибку, что и Анас (в комментариях), здесь проблема GitHub пару недель назад, и другая, возможно, связанная проблема от 2017 года. и добавив больше деталей, если у вас возникла такая же проблема.

Ответ 2

Я создал простой инструмент для переноса целевых версий фреймворка для всего решения, потому что расширение Target Migrator Extension не поддерживает Visual Studio 2017. Загрузите инструмент из моего репозитория GitHub https://github.com/Xpitfire/TargetFrameworkMigrator

Я знаю, что это не лучший способ пойти, но это сработало для меня, и, возможно, это также поможет кому-то еще.

Ответ 3

Для решения .NET Framework простое " Заменить в файлах " помогло мне:

Например: из .NET Framework 4.5.2 в .NET Framework 4.7.2

В файлах package.config заменить все

targetFramework="net452" 

в

targetFramework="net472" 

В *.csproj файлах заменить все

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

в

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

Ответ 4

Поскольку Target Framework Migrator не работает, я прокрутил свой собственный поиск/замену (используя git bash, он хорошо работает на Windows); По сути, он изменяет v4.6.x на v4.7.2, а затем преобразует файлы обратно в печально известный DOS CRLF:

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

Ответ 5

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