Retargeting di tutti i progetti in una soluzione su .NET 4.5.2


96

Ho una soluzione in Visual Studio 2012 con 170 progetti C # al suo interno. Devo eseguire il retargeting di tutti i progetti da .NET Framework 4.0 a 4.5.2.

Preferisco lasciare che sia Visual Studio a gestirlo andando nelle proprietà di ogni progetto, cambiando il framework di destinazione e lasciando che Visual Studio apporti le modifiche necessarie ai file .csproj.

Ho notato che queste modifiche includono l'aggiunta di alcuni nuovi tag XML a .csproj, a seconda di alcuni attributi del progetto corrente.

Come posso eseguire il retargeting in batch di tutti i 170 progetti C # senza utilizzare solo uno strumento di sostituzione del testo per sostituire il numero di versione di destinazione? Voglio che Visual Studio apporti tutte le modifiche e le aggiunte necessarie ai tag e la sola sostituzione non consentirà che ciò accada.


Non conosco alcun modo per farlo automaticamente .. Penso che la soluzione migliore sarebbe un registratore di macro di Windows standard, che usi i comandi da tastiera .. Ma, io eseguirò questi uno alla volta piuttosto che provare a raggrupparli insieme poiché può essere difficile identificare quando VS ha terminato il suo lavoro in tutti i casi.
Erik Funkenbusch

1
No, non dovresti farlo. Soprattutto non 4.5.2, non ha nuovi tipi utili ed è improbabile che venga coperto da futuri pacchetti multi-targeting. Proprio come 4.0x non lo era. Fai questo un progetto alla volta e solo quelli che ne hanno bisogno. Quelli in cui si desidera effettivamente aggiungere un nuovo assembly di riferimento e modificare il codice per utilizzarli. Se vuoi ignorare questo consiglio, probabilmente lo fai, quindi usa Modifica> Trova e sostituisci> Sostituisci nei file per sostituire l'elemento TargetFrameworkVersion nei file * .csproj. Assicurati che il tuo controllo del codice sorgente sia solido.
Hans Passant

1
@HansPassant La tua soluzione di Trova / Sostituisci è esattamente ciò che non volevo fare in base alla mia domanda. Ho bisogno di una soluzione più robusta.
Kyle V.

@GrantWinney Io / so / non funzionerà perché ho già provato Trova / Sostituisci e se usi quel metodo, le modifiche aggiuntive .csproj che Visual Studio avrebbe fatto altrimenti non sono implementate.
Kyle V.

1
@GrantWinney l'estensione Target Framework Migrator fa esattamente quello che volevo. Se puoi creare una risposta, la contrassegnerò come corretta. Grazie!
Kyle V.

Risposte:


84

La documentazione di MSDN " Guida alla migrazione a .NET Framework 4.5 " e " Come configurare un'app per supportare .NET Framework 4 o 4.5 " illustra solo la modifica dei progetti. Non ci sono dettagli sull'applicazione delle modifiche all'intera soluzione in una volta, né ho visto una funzione in VS che la supporta.

Tuttavia, c'è un'estensione (ben valutata) chiamata Target Framework Migrator disponibile nella galleria di Visual Studio, che supporta l'aggiornamento a 4.5.2 (così come le versioni più recenti **) e sembra che farà esattamente quello che vuoi. Il codice sorgente è disponibile su GitHub , se sei interessato.

Si noti che la mancanza di tale caratteristica può essere intenzionale (e non solo un'omissione). Sto solo indovinando, ma forse MS calcola che solo i progetti che richiedono i nuovi Framework verranno aggiornati. FWIW, se si finisce per aggiornare alcuni progetti condivisi con altre soluzioni, quelle soluzioni potrebbero non essere create fino a quando non vengono aggiornate anche loro.

Detto questo, se ti trovi in ​​un piccolo negozio con solo una (o poche) soluzioni e stai cercando di aggiornare tutto in una volta, allora forse lo strumento sopra funzionerà per te.


Non ci sono stati sviluppi su questo per anni e apparentemente lo sviluppatore non ha intenzione di passare il testimone a nessun altro.

Se non riesci a farlo funzionare con una versione più recente di .NET Framework, controlla i PR e i problemi esistenti per le correzioni, ma potresti doverli applicare tu stesso. Ad esempio, qualcuno ha pubblicato una correzione per .NET Framework v 4.7.1 . Spero che questi vengano uniti, ma non trattengo il respiro.

Se qualcun altro vede lo stesso errore di Anas (nei commenti), ecco un problema di GitHub di un paio di settimane fa e un altro problema possibilmente correlato del 2017. Considera i pollici alzandoli e aggiungendo ulteriori dettagli se hai lo stesso problema .


7
Lo strumento "target framework migrator" non funziona nell'ultimo aggiornamento 15.5.5 VS 2017, "Parametro non valido"
Anas Ghanem

1
Ha funzionato per me oggi con VS2017 da 15.7 a Framework 4.7
Tod

Dubito fortemente che MS ometterebbe intenzionalmente le funzionalità a vantaggio degli utenti ... molto più probabilmente è solo qualcos'altro a cui non hanno pensato o che non devono supportare ... trasmetterlo alla comunità ..
PJUK

1
@ Grant Ho aggiunto un commento al problema esistente. In realtà ho fatto il lavoro con una ricerca find / sed e sostituisci nei file di progetto e di configurazione.
JB. Con Monica.

2
Lo sviluppatore ha passato il testimone a dicembre 2019, puoi modificare di nuovo la tua (buona) risposta :)
Ludovic Feltz

12

Per una soluzione .NET Framework, un semplice " Sostituisci nei file " ha funzionato per me:

ad esempio : da .NET Framework 4.5.2 a .NET Framework 4.7.2

Nei file package.config , sostituisci tutto

targetFramework="net452" 

per

targetFramework="net472" 

Nei file * .csproj , sostituisci tutto

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

per

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

1
In VS 2019, "sostituisci tutto" non funziona del tutto. Devi usare ripetutamente "trova successivo". Questo è il mio ultimo progetto di sviluppo basato su Microsoft. Sto passando a MacOSX dove c'è coerenza e un livello decente di QA eseguito sui loro prodotti.
ATL_DEV

1
La modifica di targetFramework in packages.config non reinstalla il pacchetto per quel framework, quindi potresti comunque ritrovarti con la versione sbagliata. Dovresti reinstallare il pacchetto o almeno eliminare la cartella dei pacchetti e ripristinare la versione corretta del pacchetto. Il problema è con quel vecchio modello packages.config, senza reinstallare, i tuoi riferimenti dll per il pacchetto punteranno alla dll sbagliata nella sottodirectory sbagliata del pacchetto.
Triynko

3
Wow, sono tornato di nuovo a questa domanda dopo le vacanze e ho anche visto la necessità di commentare questa stessa risposta, haha. Aggiungerò che i file * .csproj e packages.config non sono le uniche cose che fanno riferimento al framework di destinazione. Ci sono anche riferimenti nei file web.config in varie sezioni. Ad esempio, in system.web, i tag compilation e httpRuntime hanno un attributo targetFramework che dovrebbe essere aggiornato. Quindi, questo processo manuale "trova e sostituisci" sembra un'idea davvero terribile che potrebbe lasciare i tuoi progetti in uno stato incoerente e corrotto.
Triynko

9

Poiché il Target Framework Migrator è guasto, ho eseguito la mia ricerca / sostituzione (usando git bash, funziona bene su Windows); Fondamentalmente cambia la v4.6.x in v4.7.2 , quindi converte i file utilizzando il famigerato CRLF del 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
Ho trovato questo e poi ho Update-Package -ReInstallfatto miracoli. Grazie!
askrich

1
Questo ha funzionato perfettamente bene per me. Grazie per questa soluzione
Maryam

Per una versione PowerShell vedere stackoverflow.com/a/2837891/463425
tkerwood

7

Ho creato io stesso un semplice strumento per migrare le versioni del framework di destinazione per un'intera soluzione, perché l'estensione Target Framework Migrator non supporta Visual Studio 2017. Scarica lo strumento dal mio repository GitHub https://github.com/Xpitfire/TargetFrameworkMigrator

So che questo non è il modo migliore per andare, ma ha funzionato per me e forse aiuterà anche qualcun altro.


Adesso lo fa di sicuro.
Jay Croghan

3

Target Framework Migrator è piuttosto utile. Per impostazione predefinita, arriva alla v4.7. Tuttavia, è facile aggiungere il supporto per v4.7.1, v4.7.2 e v4.8.

Trova il file Frameworks.xml nella cartella C: \ Users {nome utente} \ AppData \ Local \ Microsoft \ VisualStudio \ e modifica aggiungendo queste versioni del framework:

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

Dopo aver riavviato Visual Studio, vedrai le nuove versioni.


3
Esiste un fork con una versione compatibile con VS2019 che è già aggiornato su github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS

Molte grazie! Questa è stata una soluzione molto bella e facile!
fusione

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();
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.