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


96

У мене є рішення у 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 - це саме те, що я не хотів робити відповідно до свого запитання. Мені потрібне більш надійне рішення.
Kyle V.

@GrantWinney Я / знаю / це не буде працювати, оскільки я вже спробував знайти / замінити, і якщо ви використовуєте цей метод, то додаткові зміни .csproj, які зробив би Visual Studio, не реалізуються.
Kyle V.

1
Розширення @GrantWinney Target Framework Migrator робить саме те, що я хотів. Якщо ви можете створити відповідь, я позначу її правильною. Дякую!
Kyle V.

Відповіді:


84

Документація MSDN " Посібник із міграції до .NET Framework 4.5 " та " Як налаштувати програму для підтримки .NET Framework 4 або 4.5 " обговорюється лише зміна проектів. Немає деталей щодо застосування змін до всього рішення одночасно, і я не бачив функції, яка підтримує це.

Однак є (добре оцінене) розширення Target Framework Migrator, доступне в галереї Visual Studio, яке підтримує оновлення до 4.5.2 (а також новіші версії **) і схоже, що воно буде робити саме те, що ви хочете. Якщо вам цікаво, вихідний код доступний на GitHub .

Зауважте, що відсутність такої функції може бути навмисною (а не лише упущенням). Я лише здогадуюсь, але, можливо, MS вважає, що будуть модернізовані лише проекти, які потребують нових фреймворків. FWIW, якщо ви в кінцевому підсумку оновите деякі проекти, які спільно використовуються з іншими рішеннями, ці рішення можуть не вдатися створити, поки їх теж не оновлять.

Однак, якщо ви перебуваєте в невеликому магазині, де є лише одне (або декілька) рішень, і ви хочете оновити все за один прийом, можливо, вищезазначений інструмент підійде саме вам.


Років щодо цього не було , і, мабуть, розробник не планує передавати естафету комусь іншому.

Якщо вам не вдається змусити його працювати з новою версією .NET Framework, перевірте наявні виправлення неполадок та випуски на виправлення, але, можливо, доведеться застосувати їх самостійно. Наприклад, хтось опублікував виправлення для .NET Framework v 4.7.1 . Сподіваюся, вони об’єднаються, але я не затамував би дихання.

Якщо хтось інший бачить ту саму помилку, що і Анас (у коментарях), ось випуск GitHub від декількох тижнів тому та інша, можливо, пов’язана проблема з 2017 року. Подумайте, чи не подобається їм додавати великі пальці та додавати більше деталей, якщо у вас така сама проблема .


7
Інструмент "цільовий фреймворк-мігратор" не працює в останньому оновленні VS 2017 15.5.5, "Недійсний параметр"
Анас Ганем

1
Сьогодні працював у мене з VS2017 15.7 до Framework 4.7
Tod

Я дуже сумніваюся, що РС навмисно опустили б функції для користувачів ... набагато швидше, це просто щось інше, про що вони не думали або не мусять підтримувати ... передайте це спільноті ..
PJUK

1
@Grant Я додав коментар до існуючого випуску. Я насправді зробив роботу з пошуком / заміною пошуку та заміни у файлах проекту та конфігурації.
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>

1
У VS 2019 "замінити все" не зовсім працює. Вам доведеться неодноразово використовувати "знайти далі". Це мій останній проект розробки на базі Microsoft. Я переходжу до MacOSX, де є узгодженість та пристойний рівень якості для їхніх продуктів.
ATL_DEV

1
Зміна targetFramework у пакетах.config не переінсталює пакет для цього фреймворку, тому ви все одно можете отримати неправильну версію. Вам доведеться переінсталювати пакет або, принаймні, видалити папку пакетів і відновити потрібну версію пакета. Проблема полягає в тому, що стара модель package.config, без перевстановлення, ви посилання на dll для пакету буде націлена на неправильний dll в неправильному підкаталозі пакета.
Трійко

3
Ого, я знову опинився на цьому питанні після відпустки і також побачив необхідність прокоментувати цю саму відповідь, ха-ха. Додам, що файли * .csproj та пакети.config - це не єдине, що посилається на цільову структуру. Також є посилання у файлах web.config у різних розділах. Наприклад, під system.web теги компіляції та httpRuntime мають атрибут targetFramework, який потрібно оновити. Отже, цей ручний процес "знайти та замінити" здається справді жахливою ідеєю, яка може призвести до того, що ваші проекти будуть несумісними та корумпованими.
Трійко

9

Оскільки цільовий фреймворк-мігратор зламаний, я здійснив власний пошук / заміну (за допомогою git bash це працює добре у вікнах); В основному він змінює v4.6.x на v4.7.2 , потім перетворює файли назад на використання сумнозвісного CRLF 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

4
Я знайшов це, і тоді Update-Package -ReInstallроблю дива. Дякую!
askrich

1
Для мене це спрацювало чудово. Дякую за це рішення
Маріам

Для версії Powershell см stackoverflow.com/a/2837891/463425
tkerwood

7

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

Я знаю, що це не найкращий шлях, але це спрацювало для мене, і, можливо, це також допоможе комусь іншому.


Зараз це точно.
Джей Кроган,

3

Мігратор цільових фреймворків досить корисний. За замовчуванням він доходить до v4.7. Однак легко додати підтримку для v4.7.1, v4.7.2 та v4.8.

Знайдіть файл Frameworks.xml у папці C: \ Users {ім'я користувача} \ 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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.