กำหนดเป้าหมายโครงการทั้งหมดใหม่ในโซลูชันเป็น. NET 4.5.2


99

ฉันมีโซลูชันใน Visual Studio 2012 ที่มี 170 โครงการ C # อยู่ในนั้น ฉันต้องการกำหนดเป้าหมายโครงการทั้งหมดใหม่จาก. NET Framework 4.0 เป็น 4.5.2

ฉันต้องการให้ Visual Studio จัดการสิ่งนี้โดยเข้าไปที่คุณสมบัติของแต่ละโปรเจ็กต์เปลี่ยนเฟรมเวิร์กเป้าหมายและให้ Visual Studio ทำการเปลี่ยนแปลงที่จำเป็นกับไฟล์. csproj

ฉันสังเกตเห็นว่าการเปลี่ยนแปลงเหล่านี้รวมถึงการเพิ่มแท็ก XML ใหม่สองสามรายการใน. csproj ซึ่งขึ้นอยู่กับคุณลักษณะบางอย่างของโครงการปัจจุบัน

ฉันจะกำหนดเป้าหมายโปรเจ็กต์ C # ทั้งหมด 170 โครงการโดยไม่ต้องใช้เครื่องมือแทนที่ข้อความเพื่อแทนที่หมายเลขเวอร์ชันเป้าหมายได้อย่างไร ฉันต้องการให้ Visual Studio ทำการแก้ไขและเพิ่มเติมแท็กที่จำเป็นทั้งหมดและแทนที่เพียงอย่างเดียวจะไม่อนุญาตให้เกิดขึ้น


ฉันไม่รู้วิธีใดที่จะทำสิ่งนี้โดยอัตโนมัติ .. ฉันคิดว่าทางออกที่ดีที่สุดของคุณคือเครื่องบันทึกมาโครของ windows มาตรฐานซึ่งคุณใช้คำสั่งแป้นพิมพ์ .. แต่ฉันจะดำเนินการเหล่านี้ทีละครั้งแทนที่จะพยายามจัดกลุ่ม ด้วยกันเนื่องจากอาจเป็นเรื่องยากที่จะระบุว่า VS เสร็จสิ้นเมื่อใดกับงานของมันในทุกกรณี
Erik Funkenbusch

1
ไม่คุณไม่ควรทำเช่นนี้ โดยเฉพาะอย่างยิ่งไม่ใช่ 4.5.2 ไม่มีประเภทใหม่ที่มีประโยชน์และไม่น่าจะครอบคลุมโดยแพ็คหลายเป้าหมายในอนาคต เช่นเดียวกับ 4.0x ไม่ได้ ทำทีละโครงการและทำเฉพาะโครงการที่จำเป็นเท่านั้น คนที่คุณจริงต้องการที่จะเพิ่มการอ้างอิงใหม่ประกอบและปรับเปลี่ยนรหัสการใช้พวกเขา หากคุณต้องการเพิกเฉยต่อคำแนะนำนี้คุณสามารถทำได้จากนั้นใช้ Edit> Find and Replace> Replace in Files เพื่อแทนที่องค์ประกอบ TargetFrameworkVersion ในไฟล์ * .csproj ตรวจสอบให้แน่ใจว่าการควบคุมแหล่งที่มาของคุณมั่นคง
Hans Passant

1
@HansPassant วิธีการค้นหา / แทนที่ของคุณคือสิ่งที่ฉันไม่ต้องการทำตามคำถามของฉัน ฉันต้องการโซลูชันที่แข็งแกร่งกว่านี้
ไคล์ V.

@GrantWinney ฉัน / รู้ / มันใช้ไม่ได้เพราะฉันได้ลองค้นหา / แทนที่แล้วและถ้าคุณใช้วิธีนั้นการเปลี่ยนแปลง. csproj เพิ่มเติมที่ Visual Studio จะทำไม่เช่นนั้นจะไม่ถูกนำไปใช้
Kyle V.

1
@GrantWinney ส่วนขยาย Target Framework Migrator ทำสิ่งที่ฉันต้องการ หากคุณสามารถสร้างคำตอบได้ฉันจะทำเครื่องหมายว่าถูกต้อง ขอบคุณ!
Kyle V.

คำตอบ:


86

เอกสาร MSDN " คู่มือการย้ายไปยัง. NET Framework 4.5 " และ " วิธีกำหนดค่าแอปเพื่อรองรับ. NET Framework 4 หรือ 4.5 " จะกล่าวถึงเฉพาะการปรับเปลี่ยนโครงการเท่านั้น ไม่มีรายละเอียดเกี่ยวกับการใช้การเปลี่ยนแปลงกับโซลูชันทั้งหมดในครั้งเดียวและฉันไม่เห็นฟังก์ชันใน VS ที่รองรับ

อย่างไรก็ตามมีส่วนขยาย (ที่ได้รับการจัดอันดับอย่างดี) ที่เรียกว่าTarget Framework Migrator ที่มีอยู่ในแกลเลอรี Visual Studio ซึ่งรองรับการอัปเกรดเป็น 4.5.2 (เช่นเดียวกับเวอร์ชันที่ใหม่กว่า **) และดูเหมือนว่าจะทำตามที่คุณต้องการ ซอร์สโค้ดมีอยู่ในGitHubหากคุณสนใจ

โปรดทราบว่าการขาดคุณสมบัติดังกล่าวอาจเป็นไปโดยเจตนา (ไม่ใช่แค่การละเว้น) ฉันแค่คาดเดา แต่ MS อาจเป็นเพียงโครงการที่ต้องการ Frameworks ใหม่เท่านั้นที่จะได้รับการอัปเกรด FWIW หากคุณสิ้นสุดการอัปเกรดบางโครงการที่ใช้ร่วมกันกับโซลูชันอื่นโซลูชันเหล่านั้นอาจไม่สามารถสร้างได้จนกว่าจะได้รับการอัปเกรดด้วย

ดังที่กล่าวไว้หากคุณอยู่ในร้านค้าเล็ก ๆ ที่มีโซลูชันเพียงหนึ่ง (หรือสองสามอย่าง) และคุณต้องการอัปเกรดทุกอย่างในคราวเดียวบางทีเครื่องมือข้างต้นอาจเหมาะกับคุณ


ไม่มีการพัฒนาในเรื่องนี้มาหลายปีแล้วและเห็นได้ชัดว่านักพัฒนาไม่มีแผนที่จะทำส่งมอบกระบองให้ใคร

หากคุณไม่สามารถทำให้มันทำงานกับ. NET Framework เวอร์ชันใหม่กว่าได้ให้ตรวจสอบPRและปัญหาที่มีอยู่เพื่อทำการแก้ไข แต่คุณอาจต้องนำไปใช้ด้วยตนเอง ตัวอย่างเช่นคนโพสต์แก้ไขสำหรับ .NET Framework วี 4.7.1 หวังว่าสิ่งเหล่านี้จะถูกรวมเข้าด้วยกัน แต่ฉันจะไม่กลั้นหายใจ

หากใครก็ตามที่เห็นข้อผิดพลาดเช่นเดียวกับ Anas (ในความคิดเห็น) นี่คือปัญหา GitHubเมื่อสองสามสัปดาห์ก่อนและปัญหาอื่นที่อาจเกี่ยวข้องกับปี 2017 ลองยกนิ้วโป้งให้พวกเขาและเพิ่มรายละเอียดเพิ่มเติมหากคุณมีปัญหาเดียวกัน .


7
เครื่องมือ "ตัวย้ายกรอบเป้าหมาย" ล้มเหลวในการอัปเดต VS 2017 ล่าสุด 15.5.5 "พารามิเตอร์ไม่ถูกต้อง"
Anas Ghanem

1
ทำงานให้ฉันวันนี้ด้วย VS2017 15.7 ถึง Framework 4.7
ท็อด

ฉันสงสัยมากว่า MS จงใจละเว้นคุณสมบัติเพื่อประโยชน์ของผู้ใช้ ... มีแนวโน้มว่าจะเป็นเพียงอย่างอื่นที่พวกเขาไม่ได้คิดหรือไม่ต้องสนับสนุน ... ส่งต่อให้ชุมชน ..
PJUK

1
@ ขอแสดงความคิดเห็นในปัญหาที่มีอยู่ ฉันทำงานจริงด้วยการค้นหา find / sed และแทนที่ในโครงการและไฟล์ config
. กับโมนิกา.

2
ผู้พัฒนาผ่านกระบองในเดือนธันวาคม 2019 คุณสามารถแก้ไขคำตอบ (ที่ดี) ของคุณได้อีกครั้ง :)
Ludovic Feltz

13

สำหรับวิธีแก้ปัญหา. 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 "แทนที่ทั้งหมด" ไม่ได้ผล คุณต้องใช้ "find next" ซ้ำ ๆ นี่เป็นโครงการพัฒนาโดยใช้ Microsoft ล่าสุดของฉัน ฉันกำลังย้ายไปยัง MacOSX ซึ่งมีความสม่ำเสมอและระดับการควบคุมคุณภาพที่เหมาะสมกับผลิตภัณฑ์ของตน
ATL_DEV

2
การเปลี่ยน targetFramework ใน package.config ไม่ได้ติดตั้งแพ็กเกจใหม่สำหรับเฟรมเวิร์กนั้นดังนั้นคุณอาจยังใช้เวอร์ชันที่ไม่ถูกต้อง คุณต้องติดตั้งแพ็กเกจใหม่หรืออย่างน้อยก็ลบโฟลเดอร์แพ็กเกจของคุณและกู้คืนเวอร์ชันที่ถูกต้องของแพ็กเกจ ปัญหาเกิดจากรุ่น package.config เก่านั้นโดยไม่ต้องติดตั้งใหม่การอ้างอิง dll ของคุณสำหรับแพ็คเกจจะกำหนดเป้าหมาย dll ที่ไม่ถูกต้องในไดเรกทอรีย่อยที่ไม่ถูกต้องของแพ็คเกจ
Triynko

3
ว้าวจบลงที่คำถามนี้อีกครั้งหลังจากวันหยุดพักผ่อนและเห็นว่าต้องแสดงความคิดเห็นเกี่ยวกับคำตอบเดียวกันนี้ฮ่า ๆ ฉันจะเพิ่มว่าไฟล์ * .csproj และ package.config ไม่ใช่สิ่งเดียวที่อ้างอิงถึงกรอบเป้าหมาย นอกจากนี้ยังมีการอ้างอิงในไฟล์ web.config ในส่วนต่างๆ ตัวอย่างเช่นภายใต้ system.web แท็กการคอมไพล์และ httpRuntime จะมีแอตทริบิวต์ targetFramework ที่ต้องอัปเดต ดังนั้นกระบวนการ 'ค้นหาและแทนที่' ด้วยตนเองนี้จึงดูเหมือนเป็นความคิดที่แย่มากที่อาจทำให้โครงการของคุณอยู่ในสถานะที่ไม่สอดคล้องกันและเสียหาย
Triynko

10

เนื่องจากTarget Framework Migratorเสียฉันจึงทำการค้นหา / แทนที่ของตัวเอง (โดยใช้ git bash มันก็ใช้ได้บน windows) โดยทั่วไปจะเปลี่ยน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
สิ่งนี้ใช้ได้ดีสำหรับฉัน ขอบคุณสำหรับการแก้ปัญหานี้
Maryam

สำหรับเวอร์ชัน powershell โปรดดูstackoverflow.com/a/2837891/463425
tkerwood

7

ฉันได้สร้างเครื่องมือง่ายๆในการโยกย้ายเวอร์ชันเฟรมเวิร์กเป้าหมายสำหรับโซลูชันทั้งหมดเนื่องจาก Target Framework Migrator Extension ไม่รองรับ Visual Studio 2017 ดาวน์โหลดเครื่องมือจากที่เก็บ GitHub ของฉันhttps://github.com/Xpitfire/TargetFrameworkMigrator

ฉันรู้ว่านี่ไม่ใช่วิธีที่ดีที่สุด แต่มันใช้ได้ผลสำหรับฉันและอาจจะช่วยคนอื่นได้ด้วย


ตอนนี้ไม่แน่นอน
Jay Croghan

3

Target Framework Migratorมีประโยชน์มาก ตามค่าเริ่มต้นมันจะมาถึง v4.7 อย่างไรก็ตามการเพิ่มการรองรับสำหรับ v4.7.1, v4.7.2 และ v4.8 นั้นทำได้ง่ายมาก

ค้นหาไฟล์ Frameworks.xml ใน C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ folder และแก้ไขโดยเพิ่มเวอร์ชันของเฟรมเวิร์กเหล่านี้:

<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();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.