Retargeting aller Projekte in einer Lösung für .NET 4.5.2

96

Ich habe eine Lösung in Visual Studio 2012 mit 170 C # -Projekten. Ich muss alle Projekte von .NET Framework 4.0 auf 4.5.2 neu ausrichten.

Ich ziehe es vor, Visual Studio damit umgehen zu lassen, indem ich in die Eigenschaften jedes Projekts gehe, das Zielframework ändere und Visual Studio alle erforderlichen Änderungen an den .csproj-Dateien vornehmen lasse.

Ich habe festgestellt, dass diese Änderungen das Hinzufügen einiger neuer XML-Tags zur .csproj umfassen, abhängig von einigen Attributen des aktuellen Projekts.

Wie kann ich alle 170 C # -Projekte stapelweise neu ausrichten, ohne nur ein Textwerkzeug zum Ersetzen zu verwenden, um die gewünschte Versionsnummer zu ersetzen? Ich möchte, dass Visual Studio alle erforderlichen Tag-Änderungen und -Zusätze vornimmt und das Ersetzen allein dies nicht zulässt.

Kyle V.
quelle
Ich kenne keine Möglichkeit, dies automatisch zu tun. Ich denke, Ihre beste Wahl wäre ein Standard-Windows-Makrorecorder, für den Sie Tastaturbefehle verwenden. Aber ich würde diese nacheinander ausführen, anstatt zu versuchen, sie zu stapeln zusammen, da es in allen Fällen schwierig sein kann zu identifizieren, wann VS mit seiner Arbeit fertig ist.
Erik Funkenbusch
1
Nein, das solltest du nicht tun. Insbesondere nicht 4.5.2, es hat keine nützlichen neuen Typen und wird wahrscheinlich nicht von zukünftigen Multi-Targeting-Paketen abgedeckt. Genau wie 4.0x nicht. Machen Sie jeweils ein Projekt und nur diejenigen, die es benötigen. Diejenigen, bei denen Sie tatsächlich eine neue Referenzassembly hinzufügen und den Code ändern möchten, um sie zu verwenden. Wenn Sie diesen Rat ignorieren möchten, verwenden Sie wahrscheinlich Bearbeiten> Suchen und Ersetzen> In Dateien ersetzen, um das TargetFrameworkVersion-Element in den * .csproj-Dateien zu ersetzen. Stellen Sie sicher, dass Ihre Quellcodeverwaltung solide ist.
Hans Passant
1
@HansPassant Ihre Lösung von Suchen / Ersetzen ist genau das, was ich gemäß meiner Frage nicht tun wollte. Ich brauche eine robustere Lösung.
Kyle V.
@GrantWinney Ich / weiß / es wird nicht funktionieren, da ich bereits versucht habe zu suchen / ersetzen. Wenn Sie diese Methode verwenden, werden die zusätzlichen .csproj-Änderungen, die Visual Studio sonst vorgenommen hätte, nicht implementiert.
Kyle V.
1
@GrantWinney Die Target Framework Migrator-Erweiterung macht genau das, was ich wollte. Wenn Sie eine Antwort erstellen können, werde ich sie als richtig markieren. Vielen Dank!
Kyle V.

Antworten:

84

In der MSDN-Dokumentation " Migrationshandbuch zu .NET Framework 4.5 " und " Konfigurieren einer App zur Unterstützung von .NET Framework 4 oder 4.5 " werden nur das Ändern von Projekten erläutert. Es gibt keine Details zum gleichzeitigen Anwenden von Änderungen auf die gesamte Lösung, und ich habe in VS keine Funktion gesehen, die dies unterstützt.

In der Visual Studio-Galerie ist jedoch eine (gut bewertete) Erweiterung namens Target Framework Migrator verfügbar, die ein Upgrade auf 4.5.2 (sowie neuere Versionen **) unterstützt und anscheinend genau das tut, was Sie möchten. Der Quellcode ist auf GitHub verfügbar , wenn Sie interessiert sind.

Beachten Sie, dass das Fehlen einer solchen Funktion beabsichtigt sein kann (und nicht nur eine Auslassung). Ich vermute nur, aber vielleicht werden nur Projekte von MS aktualisiert , die die neuen Frameworks benötigen . FWIW, wenn Sie am Ende einige Projekte aktualisieren, die für andere Lösungen freigegeben sind, können diese Lösungen möglicherweise erst erstellt werden, wenn sie ebenfalls aktualisiert wurden.

Wenn Sie sich jedoch in einem kleinen Geschäft mit nur einer (oder wenigen) Lösungen befinden und alles auf einmal aktualisieren möchten, funktioniert das oben beschriebene Tool möglicherweise für Sie.


Es gibt seit Jahren keine Entwicklung mehr , und anscheinend hat der Entwickler keine Pläne, den Staffelstab an andere weiterzugeben .

Wenn Sie es nicht mit einer neueren .NET Framework-Version zum Laufen bringen können, überprüfen Sie die vorhandenen PRs und Probleme auf Korrekturen, müssen diese jedoch möglicherweise selbst anwenden. Beispielsweise hat jemand einen Fix für .NET Framework v 4.7.1 veröffentlicht . Hoffentlich werden diese zusammengeführt, aber ich würde meinen Atem nicht anhalten.

Wenn jemand anderes den gleichen Fehler wie Anas sieht (in den Kommentaren), gibt es hier ein GitHub-Problem von vor ein paar Wochen und ein weiteres möglicherweise verwandtes Problem von 2017. Erwägen Sie, die Daumen zu erhöhen und weitere Details hinzuzufügen, wenn Sie das gleiche Problem haben .

vivat Fische
quelle
7
Das Tool "Target Framework Migrator" schlägt beim neuesten VS 2017-Update 15.5.5, "Ungültiger Parameter"
Anas Ghanem
1
Arbeitete für mich heute mit VS2017 15.7 bis Framework 4.7
Tod
Ich bezweifle sehr, dass MS absichtlich Funktionen weglassen würde, die den Nutzern zugute kommen ... viel wahrscheinlicher ist es nur etwas anderes, über das sie nicht
nachgedacht
1
@Grant Ich habe dem vorhandenen Problem einen Kommentar hinzugefügt. Ich habe den Job tatsächlich mit einem Suchen / Ersetzen und Ersetzen in den Projekt- und Konfigurationsdateien erledigt.
JB. Mit Monica.
2
Der Entwickler hat den Staffelstab im Dezember 2019 übergeben, Sie können Ihre (gute) Antwort erneut bearbeiten :)
Ludovic Feltz
12

Für eine .NET Framework-Lösung hat ein einfaches " In Dateien ersetzen " den Trick für mich getan:

Beispiel : Von .NET Framework 4.5.2 zu .NET Framework 4.7.2

In package.config Dateien ersetzen alle

targetFramework="net452" 

zu

targetFramework="net472" 

Ersetzen Sie in * .csproj- Dateien alle

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

zu

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
Webpat
quelle
1
In VS 2019 funktioniert "Alle ersetzen" nicht ganz. Sie müssen wiederholt "find next" verwenden. Dies ist mein letztes Microsoft-basiertes Entwicklungsprojekt. Ich wechsle zu MacOSX, wo es Konsistenz und eine anständige Qualitätssicherung für ihre Produkte gibt.
ATL_DEV
1
Wenn Sie das targetFramework in packages.config ändern, wird das Paket für dieses Framework nicht neu installiert, sodass Sie möglicherweise immer noch die falsche Version erhalten. Sie müssten das Paket neu installieren oder zumindest Ihren Paketordner löschen und die richtige Version des Pakets wiederherstellen. Das Problem ist, dass bei diesem alten Paketpaketen.config-Modell ohne Neuinstallation die DLL-Referenzen für das Paket auf die falsche DLL im falschen Unterverzeichnis des Pakets abzielen.
Triynko
3
Wow, bin gleich nach dem Urlaub wieder bei dieser Frage gelandet und habe auch die Notwendigkeit gesehen, diese Antwort zu kommentieren, haha. Ich werde hinzufügen, dass die Dateien * .csproj und packages.config nicht die einzigen Dinge sind, die auf das Zielframework verweisen. Es gibt auch Verweise in web.config-Dateien in verschiedenen Abschnitten. Unter system.web verfügen die Kompilierungs- und httpRuntime-Tags beispielsweise über ein targetFramework-Attribut, das aktualisiert werden müsste. Dieser manuelle Prozess zum Suchen und Ersetzen scheint also eine wirklich schreckliche Idee zu sein, die Ihre Projekte in einem inkonsistenten und korrupten Zustand belassen könnte.
Triynko
9

Da der Target Framework Migrator defekt ist, habe ich meine eigene Suche / Ersetzung durchgeführt (mit Git Bash funktioniert es unter Windows einwandfrei). Grundsätzlich ändert es die Version 4.6.x in Version 4.7.2 und konvertiert dann die Dateien zurück in die CRLF des berüchtigten 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. Mit Monica.
quelle
4
Ich fand das und dann Update-Package -ReInstallwundere ich mich. Vielen Dank!
Askrich
1
Das hat bei mir sehr gut funktioniert. Vielen Dank für diese Lösung
Maryam
Eine Powershell-Version finden Sie unter stackoverflow.com/a/2837891/463425
tkerwood
7

Ich habe mir ein einfaches Tool zum Migrieren der Zielframeworkversionen für eine gesamte Lösung erstellt, da die Target Framework Migrator-Erweiterung Visual Studio 2017 nicht unterstützt. Laden Sie das Tool aus meinem GitHub-Repository https://github.com/Xpitfire/TargetFrameworkMigrator herunter

Ich weiß, dass dies nicht der beste Weg ist, aber es hat bei mir funktioniert und vielleicht hilft es auch jemand anderem.

Marius-Constantin Dinu
quelle
Das ist jetzt sicher.
Jay Croghan
3

Target Framework Migrator ist ziemlich nützlich. Standardmäßig wird Version 4.7 verwendet. Es ist jedoch einfach, Unterstützung für Version 4.7.1, Version 4.7.2 und Version 4.8 hinzuzufügen.

Suchen Sie die Datei Frameworks.xml im Ordner C: \ Users {Benutzername} \ AppData \ Local \ Microsoft \ VisualStudio \ und bearbeiten Sie sie, indem Sie die folgenden Framework-Versionen hinzufügen:

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

Nach dem Neustart von Visual Studio werden neue Versionen angezeigt.

Doğa Benli
quelle
2
Es gibt eine Gabel mit einer VS2019-kompatiblen Version, die bereits unter github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS
Vielen Dank! Dies war eine sehr schöne und einfache Problemumgehung!
Fusion
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
quelle