Retargeting All Projects in a Solution to .NET 4.5.2

96

Saya memiliki solusi dalam Visual Studio 2012 dengan proyek 170 C # di dalamnya. Saya perlu menargetkan ulang semua proyek dari .NET Framework 4.0 ke 4.5.2.

Saya lebih suka membiarkan Visual Studio menangani ini dengan masuk ke properti setiap proyek, mengubah kerangka kerja yang ditargetkan, dan membiarkan Visual Studio membuat perubahan yang diperlukan pada file .csproj.

Saya perhatikan bahwa perubahan ini termasuk menambahkan beberapa tag XML baru ke .csproj, bergantung pada beberapa atribut proyek saat ini.

Bagaimana saya bisa menargetkan ulang secara batch semua proyek 170 C # tanpa hanya menggunakan alat pengganti teks untuk mengganti nomor versi yang ditargetkan? Saya ingin Visual Studio membuat semua modifikasi dan penambahan tag yang diperlukan dan mengganti saja tidak akan mengizinkan hal itu terjadi.

Kyle V.
sumber
Saya tidak tahu cara untuk melakukan ini secara otomatis .. Saya pikir taruhan terbaik Anda adalah perekam makro windows standar, yang Anda gunakan perintah keyboard .. Tapi, saya akan mengeksekusi ini satu per satu daripada mencoba menumpuknya bersama-sama karena mungkin sulit untuk mengidentifikasi kapan VS selesai bekerja di semua kasus.
Erik Funkenbusch
1
Tidak, Anda tidak boleh melakukan ini. Terutama bukan 4.5.2, ini tidak memiliki tipe baru yang berguna dan tidak mungkin dicakup oleh paket multi-penargetan di masa mendatang. Sama seperti 4.0x tidak. Lakukan proyek ini satu per satu dan hanya yang membutuhkannya. Orang-orang di mana Anda benar - benar ingin menambahkan rakitan referensi baru dan memodifikasi kode untuk menggunakannya. Jika Anda ingin mengabaikan saran ini, Anda mungkin melakukannya, lalu gunakan Edit> Temukan dan Ganti> Ganti di File untuk mengganti elemen TargetFrameworkVersion di file * .csproj. Pastikan kontrol sumber Anda solid.
Hans Passant
1
@HansPassant Solusi Cari / Ganti Anda persis seperti yang tidak ingin saya lakukan menurut pertanyaan saya. Saya membutuhkan solusi yang lebih kuat.
Kyle V.
@GrantWinney Saya / tahu / itu tidak akan berfungsi karena saya sudah mencoba Temukan / Ganti dan jika Anda menggunakan metode itu maka perubahan .csproj tambahan yang akan dilakukan Visual Studio sebaliknya tidak diterapkan.
Kyle V.
1
@GrantWinney ekstensi Target Framework Migrator melakukan apa yang saya inginkan. Jika Anda dapat membuat jawaban, saya akan menandainya dengan benar. Terima kasih!
Kyle V.

Jawaban:

84

Dokumentasi MSDN " Panduan Migrasi ke .NET Framework 4.5 " dan " Cara Mengkonfigurasi Aplikasi untuk Mendukung .NET Framework 4 atau 4.5 " hanya membahas pengubahan proyek. Tidak ada detail tentang menerapkan perubahan ke seluruh solusi sekaligus, saya juga belum melihat fungsi di VS yang mendukungnya.

Namun, ada ekstensi (berperingkat baik) bernama Target Framework Migrator yang tersedia di galeri Visual Studio, yang mendukung peningkatan ke 4.5.2 (serta versi yang lebih baru **) dan sepertinya itu akan melakukan apa yang Anda inginkan. Kode sumber tersedia di GitHub , jika Anda tertarik.

Perhatikan bahwa kurangnya fitur tersebut mungkin disengaja (dan bukan hanya kelalaian). Saya hanya menebak-nebak, tapi mungkin MS hanya menghitung proyek yang membutuhkan Kerangka baru yang akan ditingkatkan. FWIW, jika Anda akhirnya memutakhirkan beberapa proyek yang dibagikan dengan solusi lain, solusi tersebut mungkin gagal dibangun sampai mereka juga ditingkatkan.

Karena itu, jika Anda berada di toko kecil dengan hanya satu (atau beberapa) solusi dan Anda ingin meningkatkan semuanya dalam sekali jalan, mungkin alat di atas akan bekerja untuk Anda.


Tidak ada perkembangan dalam hal ini selama bertahun-tahun , dan tampaknya pengembang tidak berencana untuk memberikan tongkat estafet kepada orang lain.

Jika Anda tidak dapat membuatnya bekerja dengan versi .NET Framework yang lebih baru, periksa PR dan Masalah yang ada untuk perbaikan, tetapi Anda mungkin harus menerapkannya sendiri. Misalnya, seseorang memposting perbaikan untuk .NET Framework v 4.7.1 . Mudah-mudahan ini akan bergabung, tetapi saya tidak akan menahan napas.

Jika ada orang lain yang melihat kesalahan yang sama dengan Anas (di komentar), inilah masalah GitHub dari beberapa minggu yang lalu, dan masalah lain yang mungkin terkait dari 2017. Pertimbangkan untuk mengacungkan jempol dan menambahkan lebih banyak detail jika Anda mengalami masalah yang sama .

vivat pisces
sumber
7
Alat "target framework migrator" gagal pada VS 2017 update 15.5.5 terbaru, "Parameter tidak valid"
Anas Ghanem
1
Bekerja untuk saya hari ini dengan VS2017 15,7 untuk Kerangka 4,7
Tod
Saya sangat meragukan bahwa MS akan dengan sengaja menghilangkan fitur untuk keuntungan pengguna ... kemungkinan besar itu hanya sesuatu yang tidak mereka pikirkan atau tidak perlu dukung ... menyebarkannya ke komunitas ..
PJUK
1
@Grant Saya menambahkan komentar ke masalah yang ada. Saya benar-benar melakukan pekerjaan dengan mencari / mencari dan mengganti dalam proyek dan file konfigurasi.
JB. Dengan Monica.
2
Pengembang lulus tongkat pada Desember 2019, Anda dapat mengedit jawaban (bagus) Anda lagi :)
Ludovic Feltz
12

Untuk solusi .NET Framework, " Ganti dalam file " yang sederhana berhasil untuk saya:

misalnya : Dari .NET Framework 4.5.2 ke .NET Framework 4.7.2

Di file package.config , ganti semua

targetFramework="net452" 

untuk

targetFramework="net472" 

Di file * .csproj , ganti semua

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

untuk

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
webpat
sumber
1
Di VS 2019, "ganti semua" tidak cukup berfungsi. Anda harus berulang kali menggunakan "temukan berikutnya". Ini adalah proyek pengembangan berbasis Microsoft terakhir saya. Saya pindah ke MacOSX di mana ada konsistensi dan tingkat QA yang layak dilakukan pada produk mereka.
ATL_DEV
2
Mengubah targetFramework di packages.config tidak akan menginstal ulang paket untuk framework tersebut, jadi Anda masih bisa mendapatkan versi yang salah. Anda harus menginstal ulang paket tersebut, atau setidaknya menghapus folder paket Anda dan mengembalikan versi paket yang benar. Masalahnya adalah dengan model packages.config yang lama, tanpa menginstal ulang, referensi dll Anda untuk paket tersebut akan menargetkan dll yang salah di subdirektori yang salah dari paket tersebut.
Triynko
3
Wow, akhirnya kembali lagi ke pertanyaan ini lagi setelah liburan dan juga melihat perlu mengomentari jawaban yang sama ini, haha. Saya akan menambahkan bahwa file * .csproj dan packages.config bukan satu-satunya hal yang mereferensikan kerangka target. Ada juga referensi di file web.config di berbagai bagian. Misalnya, di bawah system.web, tag kompilasi dan httpRuntime memiliki atribut targetFramework yang perlu diperbarui. Jadi, proses manual 'temukan dan ganti' ini tampak seperti ide yang sangat buruk yang dapat membuat proyek Anda tidak konsisten dan rusak.
Triynko
9

Karena Target Framework Migrator rusak, saya menggulung pencarian / penggantian saya sendiri (menggunakan git bash, ini berfungsi dengan baik di windows); Pada dasarnya ini mengubah v4.6.x menjadi v4.7.2 , kemudian mengonversi kembali file ke menggunakan CRLF DOS yang terkenal:

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. Dengan Monica.
sumber
4
Saya menemukan ini, dan kemudian Update-Package -ReInstallmelakukan keajaiban. Terima kasih!
askrich
1
Ini bekerja dengan baik untuk saya. Terima kasih untuk solusi ini
Maryam
Untuk versi PowerShell, lihat stackoverflow.com/a/2837891/463425
tkerwood
7

Saya telah membuat sendiri alat sederhana untuk memigrasi versi kerangka kerja target untuk seluruh solusi, karena Ekstensi Kerangka Kerja Migrator Target tidak mendukung Visual Studio 2017. Unduh alat dari repositori GitHub saya https://github.com/Xpitfire/TargetFrameworkMigrator

Saya tahu ini bukan cara terbaik untuk melakukannya, tetapi ini berhasil untuk saya dan mungkin juga akan membantu orang lain.

Marius-Constantin Dinu
sumber
Sekarang sudah pasti.
Jay Croghan
3

Migrator Kerangka Target cukup berguna. Secara default, ini muncul di v4.7. Namun, mudah untuk menambahkan dukungan untuk v4.7.1, v4.7.2 dan v4.8.

Temukan file Frameworks.xml di folder C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ dan edit dengan menambahkan versi framework berikut:

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

Setelah Anda memulai ulang studio visual, Anda akan melihat versi baru.

Doğa Benli
sumber
3
Ada garpu w / kompatibel VS2019 rilis yang sudah diperbarui pada github.com/Ian1971/TargetFrameworkMigrator/releases
Scotts
Terima kasih banyak! Ini adalah solusi yang sangat bagus dan mudah!
merger
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
sumber