Przekierowanie wszystkich projektów w rozwiązaniu do .NET 4.5.2

98

Mam rozwiązanie w Visual Studio 2012 zawierające 170 projektów C #. Muszę przekierować wszystkie projekty z .NET Framework 4.0 do 4.5.2.

Wolę pozwolić programowi Visual Studio zająć się tym, przechodząc do właściwości każdego projektu, zmieniając docelową strukturę i pozwalając programowi Visual Studio na wprowadzenie wszelkich niezbędnych zmian w plikach .csproj.

Zauważyłem, że te zmiany obejmują dodanie kilku nowych tagów XML do pliku .csproj, w zależności od niektórych atrybutów bieżącego projektu.

Jak można zbiorczo ponownie kierować wszystkie projekty 170 C # bez użycia narzędzia do zamiany tekstu w celu zastąpienia docelowego numeru wersji? Chcę, aby program Visual Studio wprowadził wszystkie niezbędne modyfikacje i uzupełnienia tagów, a samo zastąpienie nie pozwoli na to.

Kyle V.
źródło
Nie znam żadnego sposobu, aby zrobić to automatycznie. Myślę, że najlepszym rozwiązaniem byłby standardowy rejestrator makr dla systemu Windows, którego używasz poleceń klawiaturowych .. Ale wykonywałbym je pojedynczo, zamiast próbować je grupować razem, ponieważ we wszystkich przypadkach może być trudno określić, kiedy VS zakończy swoją pracę.
Erik Funkenbusch
1
Nie, nie powinieneś tego robić. Zwłaszcza nie 4.5.2, nie ma on nowych przydatnych typów i jest mało prawdopodobne, że zostanie uwzględniony w przyszłych pakietach ukierunkowanych na wiele celów. Tak jak 4.0x nie było. Czy ten jeden projekt na raz i tylko te, które jej potrzebują. Te, w których faktycznie chcesz dodać nowy zestaw referencyjny i zmodyfikować kod, aby z nich korzystać. Jeśli chcesz zignorować tę poradę, prawdopodobnie tak jest, a następnie użyj opcji Edycja> Znajdź i zamień> Zamień w plikach, aby zamienić element TargetFrameworkVersion w plikach * .csproj. Upewnij się, że kontrola źródła jest solidna.
Hans Passant
1
@HansPassant Twoje rozwiązanie Find / Replace jest dokładnie tym, czego nie chciałem robić zgodnie z moim pytaniem. Potrzebuję solidniejszego rozwiązania.
Kyle V.
@GrantWinney Wiem / wiem / to nie zadziała, ponieważ już próbowałem znaleźć / zamienić i jeśli używasz tej metody, dodatkowe zmiany.
Kyle V.
1
@GrantWinney rozszerzenie Target Framework Migrator robi dokładnie to, co chciałem. Jeśli możesz utworzyć odpowiedź, zaznaczę ją jako poprawną. Dzięki!
Kyle V.

Odpowiedzi:

85

Dokumentacja MSDN „ Przewodnik po migracji do .NET Framework 4.5 ” i „ Jak skonfigurować aplikację do obsługi .NET Framework 4 lub 4.5 ” omawia tylko modyfikowanie projektów. Nie ma szczegółów dotyczących stosowania zmian w całym rozwiązaniu naraz, ani nie widziałem funkcji w VS, która to obsługuje.

Jednak w galerii programu Visual Studio dostępne jest (dobrze oceniane) rozszerzenie o nazwie Target Framework Migrator , które obsługuje uaktualnianie do wersji 4.5.2 (a także nowsze wersje **) i wygląda na to, że zrobi dokładnie to, co chcesz. Jeśli jesteś zainteresowany, kod źródłowy jest dostępny na GitHub .

Zauważ, że brak takiej funkcji może być celowy (a nie tylko zaniedbanie). Zgaduję, ale może dane MS tylko te projekty, które wymagają nowych ram, zostaną zaktualizowane. FWIW, jeśli w końcu zaktualizujesz niektóre projekty, które są współdzielone z innymi rozwiązaniami, te rozwiązania mogą nie zostać zbudowane, dopóki nie zostaną zaktualizowane.

Biorąc to pod uwagę, jeśli jesteś w małym sklepie z jednym (lub kilkoma) rozwiązaniami i chcesz zaktualizować wszystko za jednym razem, być może powyższe narzędzie będzie dla Ciebie odpowiednie.


Nie było w tym rozwoju od lat i najwyraźniej deweloper nie planuje przekazać pałeczki nikomu innemu.

Jeśli nie możesz zmusić go do pracy z nowszą wersją .NET Framework, sprawdź istniejące PR i problemy pod kątem poprawek, ale być może będziesz musiał zastosować je samodzielnie. Na przykład ktoś opublikował poprawkę dla .NET Framework v 4.7.1 . Mam nadzieję, że zostaną połączone, ale nie wstrzymywałbym oddechu.

Jeśli ktoś inny widzi ten sam błąd co Anas (w komentarzach), oto problem z GitHubem sprzed kilku tygodni i inny prawdopodobnie powiązany problem z 2017 roku. Jeśli masz ten sam problem, rozważ podniesienie kciuków i dodanie więcej szczegółów .

vivat ryby
źródło
7
Błąd narzędzia „migrator platformy docelowej” w najnowszej aktualizacji 15.5.5 programu VS 2017, „Nieprawidłowy parametr”
Anas Ghanem,
1
Pracował dla mnie dzisiaj z 15,7 do ram VS2017 4.7
Tod
Bardzo wątpię, czy MS celowo pomijałby funkcje z korzyścią dla użytkowników ... znacznie bardziej prawdopodobne jest, że jest to po prostu coś, o czym nie pomyśleli lub nie musieli wspierać ... przekazać to społeczności ..
PJUK
1
@Grant Dodałem komentarz do istniejącej sprawy. Właściwie wykonałem pracę z wyszukiwaniem / sedem i zastąpieniem w projekcie i plikach konfiguracyjnych.
JB. Z Monicą.
2
Deweloper przekazał pałeczkę w grudniu 2019 r., Swoją (dobrą) odpowiedź możesz ponownie edytować :)
Ludovic Feltz
13

W przypadku rozwiązania .NET Framework wystarczyło proste „ Zamień w plikach ”:

np . z .NET Framework 4.5.2 do .NET Framework 4.7.2

W plikach package.config zamień wszystkie

targetFramework="net452" 

do

targetFramework="net472" 

W plikach * .csproj zamień wszystkie

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

do

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
webpat
źródło
1
W VS 2019 „Zastąp wszystko” nie działa. Musisz wielokrotnie używać „znajdź następny”. To mój ostatni projekt programistyczny oparty na Microsoft. Przechodzę na MacOSX, gdzie jest spójność i przyzwoity poziom kontroli jakości wykonywanych na ich produktach.
ATL_DEV
2
Zmiana targetFramework w packages.config nie powoduje ponownej instalacji pakietu dla tej platformy, więc nadal możesz skończyć z niewłaściwą wersją. Będziesz musiał ponownie zainstalować pakiet lub przynajmniej usunąć folder z pakietami i przywrócić odpowiednią wersję pakietu. Problem polega na tym, że stary model packages.config, bez ponownej instalacji, twoje odwołania dll dla pakietu będą skierowane na niewłaściwą bibliotekę dll w niewłaściwym podkatalogu pakietu.
Triynko
3
Wow, skończyłem z powrotem na to pytanie po wakacjach i również zobaczyłem potrzebę skomentowania tej samej odpowiedzi, haha. Dodam, że pliki * .csproj i packages.config nie są jedynymi rzeczami, które odwołują się do docelowego frameworka. Istnieją również odniesienia w plikach web.config w różnych sekcjach. Na przykład w obszarze system.web tagi kompilacji i httpRuntime mają atrybut targetFramework, który wymagałby aktualizacji. Tak więc ten ręczny proces „znajdź i zamień” wydaje się naprawdę okropnym pomysłem, który może pozostawić projekty w niespójnym i skorumpowanym stanie.
Triynko
10

Ponieważ Target Framework Migrator jest uszkodzony, przeprowadziłem własne wyszukiwanie / zamianę (używając git bash, działa dobrze w systemie Windows); Zasadniczo zmienia v4.6.x na v4.7.2 , a następnie konwertuje pliki z powrotem na użycie niesławnego 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
JB. Z Monicą.
źródło
4
Znalazłem to, a potem Update-Package -ReInstallczynię cuda. Dzięki!
askrich
1
To zadziałało dla mnie doskonale. Dziękuję za to rozwiązanie
Maryam
Wersja PowerShell znajduje się na stackoverflow.com/a/2837891/463425
tkerwood
7

Zbudowałem sobie proste narzędzie do migracji docelowych wersji frameworka dla całego rozwiązania, ponieważ rozszerzenie Target Framework Migrator nie obsługuje programu Visual Studio 2017. Pobierz narzędzie z mojego repozytorium GitHub https://github.com/Xpitfire/TargetFrameworkMigrator

Wiem, że to nie jest najlepsza droga, ale mi się udało i może pomoże też komuś innemu.

Marius-Constantin Dinu
źródło
Teraz na pewno.
Jay Croghan
3

Target Framework Migrator jest całkiem przydatny. Domyślnie dochodzi do wersji 4.7. Jednak łatwo jest dodać obsługę wersji 4.7.1, 4.7.2 i 4.8.

Znajdź plik Frameworks.xml w folderze C: \ Users {nazwa użytkownika} \ AppData \ Local \ Microsoft \ VisualStudio \ i edytuj, dodając następujące wersje frameworka:

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

Po ponownym uruchomieniu programu Visual Studio zobaczysz nowe wersje.

Doğa Benli
źródło
3
Istnieje widelec z wersją zgodną z VS2019, która jest już zaktualizowana na github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS
Wielkie dzięki! To było bardzo przyjemne i łatwe obejście!
fuzja
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
źródło