XP üzerinde bir .NET 4.5 uygulaması çalıştırmak mümkün mü?


86

Önce şunu okudum:

Bu yüzden, son maddeden, gerçekten bunun etrafında bir yol olmadığını düşünüyorum, ancak ekibim .NET 4.0'dan .NET 4.5'e yükseltmek istediği için kesin bir cevap alıp alamayacağımı görmek zorundaydım. Ancak, XP'yi desteklemeliyiz.

XP'yi desteklemek istiyorsak .NET 4.5'e gitme imkânı yok mu?

Aklıma gelen tek şey, iki ayrı çözüm oluşturmaktı, ancak .NET 4.5 özelliklerini kullanırsak kod tabanlarının birbirinden ayrılması gerekirdi.

Bu yüzden, bulamadığım ve başkalarının da zaten bildiği harika bir çözüm arıyorum.


9
Hayır, yapamazsınız. XP kesinlikle ölene kadar 4.0'a bağlı kalın.
Federico Berasategui

Yanıtlar:


188

Bu cevabı göndermekten çekiniyorum, aslında teknik olarak mümkün ama pratikte o kadar iyi çalışmıyor. CLR'nin sürüm numaraları ve çekirdek çerçeve derlemeleri 4.5'te değiştirilmemiştir. Hala CLR'nin v4.0.30319'u hedefliyorsunuz ve çerçeve derleme sürüm numaraları hala 4.0.0.0'dır. İldasm.exe gibi bir sökücü ile baktığınızda derleme bildirimiyle ilgili ayırt edici olan tek şey, 4.5'in gerekli olduğunu ve değiştirilmesi gerektiğini söyleyen bir [TargetFramework] özniteliğinin varlığıdır. Aslında o kadar kolay değil, derleyici tarafından yayınlanır.

En büyük fark o kadar görünür değil, Microsoft derlemelerin yürütülebilir başlığında uzun süredir gecikmiş bir değişiklik yaptı. Çalıştırılabilir dosyanın hangi Windows sürümüyle uyumlu olduğunu belirtir. XP, Windows 2000 ile başlayan önceki bir Windows nesline aittir. Ana sürüm numarası 5'tir. Vista, mevcut nesil, ana sürüm numarası 6'nın başlangıcıydı.

.NET derleyicileri her zaman minimum sürüm numarasını 4.00, Windows NT ve Windows 9x sürümü olarak belirtmişlerdir. Bunu, derlemede dumpbin.exe / üstbilgileri çalıştırarak görebilirsiniz. Örnek çıktı şuna benzer:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

.NET 4.5'teki yenilikler, derleyicilerin bu alt sistem sürümünü 6.00 olarak değiştirmesidir. Windows, sadece yeterince küçük olup olmadığını kontrol etmenin ötesinde bu sayıya dikkat ettiği için büyük ölçüde vadesi geçmiş bir değişiklik. Ayrıca, programın Windows'un eski sürümlerinde çalışmak üzere yazıldığını varsaydığı için uygulama uyumlu özelliklerini de açar. Bu özellikler soruna neden olur, özellikle Windows'un Aero'daki bir pencere boyutu hakkında yatması zahmetlidir. Programın Aero içeren bir Windows sürümünde çalışacak şekilde tasarlandığını gördüğünde, bir Aero penceresinin kalın sınırları hakkında yalan söylemeyi bırakır.

Derlemelerinizde Editbin.exe'yi / subsystem seçeneğiyle çalıştırarak bu sürüm numarasını değiştirebilir ve tekrar 4,00 olarak ayarlayabilirsiniz. Bu cevap , örnek bir postbuild olayını gösterir.

Bununla birlikte, iyi haberin nerede bittiği ile ilgili, önemli bir sorun, .NET 4.5'in .NET 4.0 ile pek uyumlu olmamasıdır. Şimdiye kadarki en büyük sorun, sınıfların bir derlemeden diğerine taşınmasıdır. En önemlisi, bu [Uzantı] özniteliğinde gerçekleşti. System.Core.dll'de daha önce .NET 4.5'te Mscorlib.dll'ye taşınırdı. Kendi uzantı yöntemlerinizi bildirirseniz, programınız, System.Core başvuru derlemesinin .NET 4.5 sürümündeki [TypeForwardedTo] özniteliği tarafından etkinleştirilen özniteliği Mscorlib'de aramayı söyler. Ancak programınızı .NET 4.0'da çalıştırdığınızda orada değil

Ve elbette, yalnızca .NET 4.5'te bulunan sınıfları ve yöntemleri kullanmayı bırakmanıza yardımcı olacak hiçbir şey yoktur. Bunu yaptığınızda, programınız 4.0'da çalıştırıldığında TypeLoadException veya MissingMethodException ile başarısız olur

Sadece 4.0'ı hedefleyin ve tüm bu sorunlar ortadan kalkar. Veya programcıların sık sık veremeyeceği, ancak neden olduğu güçlüklere işaret ederek kesinlikle teşvik edebileceği bir iş kararı olan bu sıkışıklığı kırın ve XP'yi desteklemeyi bırakın. Elbette eski işletim sistemlerini desteklemenin sıfır olmayan bir maliyeti var, sadece test etme çabası önemli. Yönetim tarafından genellikle fark edilmeyen bir maliyet olan Windows uyumluluğu, kendilerine belirtilmedikçe efsanevidir. Bu maliyeti müşteriye iletin ve doğru kararı çok daha hızlı verme eğilimindedirler :) Ancak bu konuda size yardımcı olamayız.


2
Teşekkürler Hans, bazı önemli değişiklikler olduğunu düşündüm. Ben de geçici çözümü takdir ediyorum. Belirttiğiniz nedenlerle bununla gidemeyiz, ancak bilmek güzel. Belki XP bir gün
tamamen ortadan kalkar

3
just the testing effort is substantial- yönetimimizin "XP desteğinin düşmesine izin vermesini" sağlayan şey budur.
Christoph Fink

Bunun eski bir gönderi olduğunu biliyorum - ama - @JustinPihony: Şirketiniz daha yeni bir işletim sistemi kurmayı ve ardından VMWare veya Virtual Box kurmayı hiç düşündü mü? Windows 7 için biraz geç - ancak Microsoft, 7 ve XP arasında geçiş yapmanıza izin veren sanal bir Windows XP yüklemesini bıraktı. Sadece bir düşünce. :-)
Mark Manning

@MarkManning bizim kontrolümüzde değildi. Başka bir yerde kullanılıyordu.
Justin Pihony

1
@JustinPihony: Ah. Hmmmmm ...... Diğer tek önerim kluge. İşletim sistemi sürümünü yakalayın ve ardından sınıflarınızdaki tüm işlevleri dizilere (veya bir diziye) yerleştirilecek şekilde ayarlayın. Bir dizinin (veya bir dizinin bir kısmının) XP için ve diğerinin daha yeni işletim sistemleri için olmasını sağlayın. O zaman ihtiyacınız olan tek şey, hangi kümenin kullanılacağını belirtmek için kullanılan bir tür küresel değişkendir. Çağrıların tümü aynı olabilir (veya aynı görünebilir) ancak bir set NET40_ <FUNCTION> kullanır ve diğerleri NET45_ <FUNCTION> kullanabilir. Bu, işlevin kendisine yapılan dolaylı bir çağrı olacaktır. bu mantıklı mı?
Mark Manning

21

Ne yazık ki hayır, XP'de 4.5 program çalıştıramazsınız.

Ve bu Connect sayfasındaki ilgili gönderi:

Microsoft tarafından 23/03/2012 tarihinde 10:39 tarihinde gönderildi
Rapor için teşekkürler. Bu davranış, .NET Framework 4.5 Beta'da tasarım gereğidir. Desteklenen minimum işletim sistemleri Windows 7, Windows Server 2008 SP2 ve Windows Server 2008 R2 SP1'dir. Windows XP, Beta sürümü için desteklenen bir işletim sistemi değildir.


8

Mono projesi Windows XP desteğini bıraktı ve bundan bahsetmeyi "unuttu" . Hala Windows XP SP2'nin desteklenen minimum sürüm olduğunu iddia etseler de, aslında Windows Vista'dır.

Mono'nun Windows XP'yi destekleyen son sürümü 3.2.3'tür.


7

Mono deneyin:

http://www.go-mono.com/mono-downloads/download.html

Bu indirme, Windows XP, 2003, Vista ve Windows 7'nin tüm sürümlerinde çalışır.


2
Mono, .NET'ten daha yavaştır ve .NET 4.5'in çoğu özelliğine sahip olsa da, WPF ( mono-project.com/Compatibility ) gibi bazı ana bileşenlerden yoksundur . Bu nedenle, ihtiyacınız olan her şeyi sağlıyorsa XP için Mono'yu kullanabilirsiniz ve performans açısından sorun yoktur. Artı tarafta, özel bir "Mono yapı" oluşturmaya gerek yoktur, normal .NET 4.5 yapısı genellikle Mono altında çalışır, ancak uyumlu olduğunuzdan emin olmak için özellikle Mono'ya karşı test etmeniz gerekir.
Qwertie

2
Windows XP SP3 altında mono-3.12.1-gtksharp-2.12.26-win32-0.msi'yi denedim ve "mono.exe geçerli bir Win32 uygulaması değil" hatasıyla başarısız oldu . Ayrıca, "mono.exe - Giriş Noktası Bulunamadı. İşlem giriş noktası InterlockedCompareExchange64, dinamik bağlantı kitaplığı KERNEL32'de bulunamamış olan mono-3.0.10-gtksharp-2.12.11-win32-0.exe'yi de denedim . .dll " .
Cristian Ciupitu

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.