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

97

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

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

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

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

Кайл В.
источник
Я не знаю, как сделать это автоматически ... Я думаю, что лучше всего будет стандартный рекордер макросов Windows, в котором вы используете команды клавиатуры ... Но я бы выполнял их по одному, а не пытался их объединить вместе, поскольку во всех случаях может быть трудно определить, когда VS завершил свою работу.
Эрик Фанкенбуш
1
Нет, тебе не следует этого делать. В частности, 4.5.2, в нем нет новых полезных типов, и он вряд ли будет охвачен будущими пакетами с множественным нацеливанием. Так же, как 4.0x не было. Выполняйте один проект за раз и только те, которые в нем нуждаются. Те, где вы действительно хотите добавить новую эталонную сборку и изменить код, чтобы использовать их. Если вы хотите проигнорировать этот совет, возможно, вы это сделаете, тогда используйте Правка> Найти и заменить> Заменить в файлах, чтобы заменить элемент TargetFrameworkVersion в файлах * .csproj. Убедитесь, что ваш исходный контроль надежен.
Ханс Пассан
1
@HansPassant Ваше решение Find / Replace - это именно то, что я не хотел делать в соответствии с моим вопросом. Мне нужно более надежное решение.
Кайл В.
@GrantWinney Я / знаю / это не сработает, потому что я уже пробовал найти / заменить, и если вы используете этот метод, дополнительные изменения .csproj, которые Visual Studio сделала бы в противном случае, не будут реализованы.
Кайл В.
1
@GrantWinney - расширение Target Framework Migrator делает именно то, что я хотел. Если вы сможете дать ответ, я отмечу его как правильный. Спасибо!
Кайл В.

Ответы:

84

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

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

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

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


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

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

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

виват рыбы
источник
7
Инструмент «миграции целевой платформы» не работает в последнем обновлении VS 2017 15.5.5, «Недопустимый параметр»
Анас Ганем,
1
Работал у меня сегодня с VS2017 15.7 до Framework 4.7
Tod
Я очень сомневаюсь, что MS намеренно опускает функции в интересах пользователей ... гораздо более вероятно, что это просто что-то еще, о чем они не думали или не должны поддерживать ... передать это сообществу ...
PJUK
1
@Grant Я добавил комментарий к существующей проблеме. Я действительно выполнил работу с поиском / sed поиском и заменой в файлах проекта и конфигурации.
JB. С Моникой.
2
Разработчик передал эстафету в декабре 2019 года, вы можете снова отредактировать свой (хороший) ответ :)
Людовик Фельц,
12

Для решения .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>
Webpat
источник
1
В VS 2019 «заменить все» не совсем работает. Вы должны многократно использовать «найти дальше». Это мой последний проект разработки на базе Microsoft. Я перехожу на MacOSX, где есть согласованность и приличный уровень контроля качества их продуктов.
ATL_DEV
2
Изменение targetFramework в packages.config не переустанавливает пакет для этой платформы, поэтому вы все равно можете получить неправильную версию. Вам придется переустановить пакет или, по крайней мере, удалить папку пакетов и восстановить правильную версию пакета. Проблема заключается в том, что старая модель packages.config, без переустановки, ссылки на dll для пакета будут нацелены на неправильную dll в неправильном подкаталоге пакета.
Трийнко
3
Вау, снова вернулся к этому вопросу после отпуска, а также увидел необходимость прокомментировать тот же ответ, ха-ха. Я добавлю, что файлы * .csproj и packages.config - не единственные вещи, которые ссылаются на целевую платформу. Также есть ссылки в файлах web.config в различных разделах. Например, в system.web теги compilation и httpRuntime имеют атрибут targetFramework, который необходимо обновить. Таким образом, этот ручной процесс «найти и заменить» кажется действительно ужасной идеей, которая может привести к тому, что ваши проекты окажутся в непоследовательном и поврежденном состоянии.
Трийнко
9

Поскольку 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
JB. С Моникой.
источник
4
Я нашел это, а потом Update-Package -ReInstallтворит чудеса. Спасибо!
askrich 08
1
Это отлично сработало для меня. Спасибо за это решение
Марьям
Для версии Powershell см stackoverflow.com/a/2837891/463425
tkerwood
7

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

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

Мариус-Константин Дину
источник
Теперь это точно.
Джей Кроган,
3

Target Framework Migrator очень полезен. По умолчанию это версия v4.7. Однако легко добавить поддержку версий 4.7.1, 4.7.2 и 4.8.

Найдите файл Frameworks.xml в папке C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ и отредактируйте, добавив следующие версии фреймворка:

<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"/>

После перезапуска Visual Studio вы увидите новые версии.

Дога Бенли
источник
3
Существует форк с версией, совместимой с VS2019, которая уже обновлена ​​на github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS
Большое спасибо! Это был очень приятный и простой обходной путь!
слияние
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
источник