.NET 4.5.2 Çözümündeki Tüm Projeleri Yeniden Hedefleme


98

İçinde 170 C # projesi olan Visual Studio 2012'de bir çözümüm var. .NET Framework 4.0'dan 4.5.2'ye kadar tüm projeleri yeniden hedeflemem gerekiyor.

Her projenin özelliklerine girerek, hedeflenen çerçeveyi değiştirerek ve Visual Studio'nun .csproj dosyalarında gerekli değişiklikleri yapmasına izin vererek Visual Studio'nun bunu halletmesine izin vermeyi tercih ediyorum.

Bu değişikliklerin, mevcut projenin bazı özelliklerine bağlı olarak .csproj'a birkaç yeni XML etiketi eklemeyi içerdiğini fark ettim.

Yalnızca hedeflenen sürüm numarasını değiştirmek için bir metin değiştirme aracı kullanmadan 170 C # projesinin tümünü toplu olarak yeniden hedefleyebilirim? Visual Studio'nun gerekli tüm etiket değişikliklerini ve eklemelerini yapmasını istiyorum ve tek başına değiştirme buna izin vermeyecek.


Bunu otomatik olarak yapmanın bir yolunu bilmiyorum .. Bence en iyi bahsiniz, klavye komutlarını kullandığınız standart bir Windows makro kaydedici olacaktır. Her durumda VS'nin çalışmasının ne zaman yapıldığını belirlemek zor olabileceğinden birlikte.
Erik Funkenbusch

1
Hayır, bunu yapmamalısın. Özellikle 4.5.2 değil, yararlı yeni türleri yoktur ve gelecekteki çoklu hedefleme paketleri tarafından kapsanması olası değildir. Tıpkı 4.0x'in olmadığı gibi. Bunu her seferinde bir proje ve yalnızca ihtiyacı olanları yapın. Olanlar nereye aslında montaj yeni bir başvuru ekleyin ve bunları kullanmak için kodunu değiştirmek istiyorum. Bu tavsiyeyi göz ardı etmek istiyorsanız, muhtemelen yaparsınız, o zaman * .csproj dosyalarındaki TargetFrameworkVersion öğesini değiştirmek için Düzenle> Bul ve Değiştir> Dosyalarda Değiştir'i kullanın. Kaynak kontrolünüzün sağlam olduğundan emin olun.
Hans Passant

1
@HansPassant Bul / Değiştir çözümünüz, soruma göre tam olarak yapmak istemediğim şey. Daha sağlam bir çözüme ihtiyacım var.
Kyle V.

@GrantWinney Ben / biliyorum / çalışmıyor çünkü Bul / Değiştir'i zaten denedim ve bu yöntemi kullanırsanız, aksi takdirde Visual Studio'nun yapacağı ek .csproj değişiklikleri uygulanmaz.
Kyle V.

1
@GrantWinney Target Framework Migrator uzantısı tam olarak istediğimi yapıyor. Bir cevap oluşturabilirseniz, doğru olarak işaretleyeceğim. Teşekkürler!
Kyle V.

Yanıtlar:


85

" .NET Framework 4.5'e Geçiş Kılavuzu " ve " .NET Framework 4 veya 4.5'i Desteklemek için Bir Uygulama Nasıl Yapılandırılır " adlı MSDN belgeleri yalnızca projelerin değiştirilmesini anlatır. Değişikliklerin tüm çözüme aynı anda uygulanmasına ilişkin hiçbir ayrıntı yok veya VS'de bunu destekleyen bir işlev görmedim.

Ancak, Visual Studio galerisinde 4.5.2'ye yükseltmeyi (ve daha yeni sürümler **) destekleyen ve tam olarak istediğiniz şeyi yapacak gibi görünen Target Framework Migrator adlı (iyi derecelendirilmiş) bir uzantı vardır . Eğer ilgileniyorsanız kaynak kodu GitHub'da mevcuttur .

Böyle bir özelliğin eksikliğinin kasıtlı olabileceğini (ve sadece bir ihmal olmadığını) unutmayın. Sadece tahmin ediyorum, ama belki MS figürleri sadece yeni Çerçevelere ihtiyaç duyan projeler yükseltilecek. FWIW, diğer çözümlerle paylaşılan bazı projeleri yükseltirseniz, bu çözümler de yükseltilene kadar oluşturulamayabilir.

Bununla birlikte, yalnızca bir (veya birkaç) çözümü olan küçük bir mağazadaysanız ve her şeyi tek seferde yükseltmek istiyorsanız, o zaman belki yukarıdaki araç sizin için işe yarayacaktır.


Yıllardır bu konuda bir gelişme olmadı ve görünüşe göre geliştiricinin batonu başka birine devretme planı yok.

Daha yeni bir .NET Framework sürümüyle çalışmasını sağlayamıyorsanız, düzeltmeler için mevcut PR'leri ve Sorunları kontrol edin , ancak bunları kendiniz uygulamanız gerekebilir. Örneğin, birisi .NET Framework v 4.7.1 için bir düzeltme yayınladı . Umarım bunlar birleşir, ama nefesimi tutmam.

Başkası Anas ile aynı hatayı görüyorsa (yorumlarda), işte birkaç hafta öncesinden bir GitHub sorunu ve 2017'den kalma olasılıkla ilgili başka bir sorun . Aynı sorunu yaşıyorsanız, onları beğenmeyi ve daha fazla ayrıntı eklemeyi düşünün. .


7
"Hedef çerçeve taşıma" aracı, en son VS 2017 güncellemesi 15.5.5, "Geçersiz parametre"
Anas Ghanem

1
Bugün benim için VS2017 15.7'den Framework 4.7'ye kadar çalıştı
Tod

MS'in, kullanıcıların yararlanması için özellikleri kasıtlı olarak çıkaracağından çok şüpheliyim ... çok daha büyük olasılıkla bu, düşünmedikleri veya desteklemek zorunda olmadıkları başka bir şeydir ... topluluğa
aktarın

1
@Grant mevcut sayıya bir yorum ekledim. Aslında işi proje ve yapılandırma dosyalarında bul / sed araması ve değiştirme ile yaptım.
JB. Monica ile.

2
Geliştirici, batonu Aralık 2019'da geçti, (iyi) cevabınızı tekrar düzenleyebilirsiniz :)
Ludovic Feltz

13

Bir .NET Framework çözümü için, basit bir " Dosyalarda değiştir " benim için hile yaptı:

örneğin : Gönderen .NET Framework 4.5.2 için .NET Framework 4.7.2

In package.config dosyaları tümünü değiştir

targetFramework="net452" 

-e

targetFramework="net472" 

İçinde * .Csproj dosyaları, tümünü değiştir

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

-e

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

1
VS 2019'da "tümünü değiştir" pek işe yaramıyor. "Sonrakini bul" u tekrar tekrar kullanmanız gerekir. Bu, Microsoft tabanlı son geliştirme projem. Ürünlerinde tutarlılık ve yeterli düzeyde QA'nın uygulandığı MacOSX'e geçiyorum.
ATL_DEV

2
Package.config dosyasındaki targetFramework'un değiştirilmesi, bu çerçevenin paketini yeniden yüklemez, bu nedenle yine de yanlış sürüme sahip olabilirsiniz. Paketi yeniden yüklemeniz veya en azından paketler klasörünüzü silmeniz ve paketin doğru sürümünü geri yüklemeniz gerekir. Sorun şu ki eski packages.config modeliyle, yeniden yüklemeden, paket için dll referanslarınız, paketin yanlış alt dizinindeki yanlış dll'yi hedefliyor olacak.
Triynko

3
Vay canına, tatilden sonra tekrar bu soruya geri döndüm ve aynı cevaba da yorum yapma gereğini gördüm haha. * .Csproj ve packages.config dosyalarının hedef çerçeveye başvuran tek şey olmadığını ekleyeceğim. Ayrıca web.config dosyalarında çeşitli bölümlerde referanslar vardır. Örneğin, system.web altında, derleme ve httpRuntime etiketlerinin güncellenmesi gereken bir targetFramework özniteliği vardır. Dolayısıyla, bu manuel 'bul ve değiştir' süreci, projelerinizi tutarsız ve bozuk durumda bırakabilecek gerçekten korkunç bir fikir gibi görünüyor.
Triynko

10

Yana Hedef Çerçeve Yükseltici bozuldu, benim kendi arama / değiştirme (git bash kullanarak, bu pencerelerde Tamam çalışır) haddelenmiş; Temel olarak değiştirir v4.6.x içine v4.7.2 , o zaman rezil DOS'A'ın karakterlerinden ayırarak bir dosya geri dönüştürür:

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
Bunu buldum ve sonra Update-Package -ReInstallharikalar yaratın. Teşekkürler!
askrich

1
Bu benim için gayet iyi çalıştı. Bu çözüm için teşekkürler
Maryam

Bir powershell sürümü için bkz. Stackoverflow.com/a/2837891/463425
tkerwood


3

Hedef Çerçeve Taşıyıcı oldukça kullanışlıdır. Varsayılan olarak, v4.7'ye gelir. Bununla birlikte, v4.7.1, v4.7.2 ve v4.8 için destek eklemek kolaydır.

C: \ Users {kullanıcı adı} \ AppData \ Local \ Microsoft \ VisualStudio \ klasöründe Frameworks.xml dosyasını bulun ve şu çerçeve sürümlerini ekleyerek düzenleyin:

<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 stüdyosunu yeniden başlattıktan sonra yeni sürümler göreceksiniz.


3
W çatal / zaten güncellenir bir VS2019 uyumlu sürüm bulunmamaktadır github.com/Ian1971/TargetFrameworkMigrator/releases
Scotts

Çok teşekkürler! Bu çok güzel ve kolay bir çözümdü!
birleşme

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.