Apakah mungkin menjalankan aplikasi .NET 4.5 di XP?

86

Pertama, saya telah membaca yang berikut ini:

Jadi, dari poin terakhir, saya benar-benar berpikir tidak ada jalan lain, tetapi saya harus melihat apakah saya bisa mendapatkan jawaban pasti karena tim saya ingin meningkatkan dari .NET 4.0 ke .NET 4.5. Namun, kami harus mendukung XP.

Apakah tidak ada kemungkinan untuk menggunakan .NET 4.5 jika kita ingin mendukung XP?

Satu-satunya hal yang dapat saya pikirkan adalah membuat dua solusi terpisah, tetapi basis kode harus berbeda jika kami menggunakan fitur .NET 4.5.

Jadi, saya mencari beberapa solusi luar biasa yang tidak dapat saya temukan dan orang lain mungkin sudah tahu.

Justin Pihony
sumber
9
Tidak, tidak boleh. Tetap gunakan 4.0 sampai XP pasti mati.
Federico Berasategui

Jawaban:

188

Saya ragu untuk memposting jawaban ini, sebenarnya secara teknis mungkin tetapi tidak berhasil dengan baik dalam praktiknya. Nomor versi CLR dan rakitan kerangka inti tidak diubah di 4.5. Anda masih menargetkan v4.0.30319 CLR dan nomor versi rakitan kerangka masih 4.0.0.0. Satu-satunya hal yang membedakan tentang manifes perakitan ketika Anda melihatnya dengan disassembler seperti ildasm.exe adalah adanya atribut [TargetFramework] yang mengatakan bahwa 4,5 diperlukan, yang harus diubah. Sebenarnya tidak semudah itu, ini dikeluarkan oleh kompiler.

Perbedaan terbesar tidak terlalu terlihat, Microsoft membuat perubahan yang sudah lama tertunda di header yang dapat dieksekusi dari majelis. Yang menentukan versi Windows apa yang dapat dieksekusi kompatibel dengan. XP milik generasi Windows sebelumnya, dimulai dengan Windows 2000. Nomor versi utama mereka adalah 5. Vista adalah awal dari generasi sekarang, nomor versi utama 6.

Kompiler .NET selalu menetapkan nomor versi minimum menjadi 4.00, versi Windows NT dan Windows 9x. Anda dapat melihat ini dengan menjalankan dumpbin.exe / header pada rakitan. Output sampel terlihat seperti ini:

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

Apa yang baru di .NET 4.5 adalah bahwa kompiler mengubah versi subsistem itu menjadi 6.00. Perubahan yang sebagian besar telah jatuh tempo karena Windows memperhatikan angka tersebut, lebih dari sekadar memeriksa apakah jumlahnya cukup kecil. Itu juga mengaktifkan fitur appcompat karena mengasumsikan bahwa program itu ditulis untuk bekerja pada versi Windows yang lama. Fitur-fitur ini menyebabkan masalah, terutama karena letak Windows tentang ukuran jendela di Aero yang merepotkan. Itu berhenti berbohong tentang batas tebal jendela Aero ketika dapat melihat bahwa program itu dirancang untuk berjalan pada versi Windows yang memiliki Aero.

Anda dapat mengubah nomor versi itu dan mengaturnya kembali ke 4.00 dengan menjalankan Editbin.exe di assemblies Anda dengan opsi / subsistem. Jawaban ini menunjukkan contoh acara postbuild.

Namun di situlah kabar baik berakhir, masalah yang signifikan adalah bahwa .NET 4.5 tidak terlalu kompatibel dengan .NET 4.0. Sejauh ini masalah terbesar adalah bahwa kelas dipindahkan dari satu rakitan ke rakitan lainnya. Terutama, itu terjadi pada atribut [Extension]. Sebelumnya di System.Core.dll, itu dipindahkan ke Mscorlib.dll di .NET 4.5. Itu kaboom di XP jika Anda mendeklarasikan metode ekstensi Anda sendiri, program Anda mengatakan untuk mencari di Mscorlib untuk atribut, diaktifkan oleh atribut [TypeForwardedTo] di versi .NET 4.5 dari perakitan referensi System.Core. Tapi itu tidak ada saat Anda menjalankan program Anda di .NET 4.0

Dan tentu saja tidak ada yang bisa membantu Anda berhenti menggunakan kelas dan metode yang hanya tersedia di .NET 4.5. Jika Anda melakukannya, program Anda akan gagal dengan TypeLoadException atau MissingMethodException saat dijalankan pada 4.0

Cukup targetkan 4.0 dan semua masalah ini hilang. Atau hancurkan kebuntuan itu dan hentikan mendukung XP, keputusan bisnis yang sering tidak dapat dibuat oleh pemrogram tetapi pasti dapat didorong dengan menunjukkan kerepotan yang ditimbulkannya. Tentu saja ada biaya yang tidak nol untuk harus mendukung sistem operasi kuno, hanya upaya pengujian yang substansial. Suatu biaya yang tidak sering dikenali oleh manajemen, kompatibilitas Windows sangat legendaris, kecuali jika ditunjukkan kepada mereka. Teruskan biaya tersebut kepada klien dan mereka cenderung membuat keputusan yang tepat jauh lebih cepat :) Namun kami tidak dapat membantu Anda.

Hans Passant
sumber
2
Terima kasih Hans, saya pikir ada beberapa perubahan besar. Saya juga menghargai solusinya. Kami tidak dapat melakukannya karena alasan yang Anda tentukan, tetapi ada baiknya untuk mengetahuinya. Mungkin XP akan hilang selamanya suatu hari nanti ....
Justin Pihony
3
just the testing effort is substantial- Itulah yang membuat manajemen kami "memungkinkan untuk menjatuhkan dukungan XP".
Christoph Fink
Saya tahu ini adalah posting lama - tetapi - @JustinPihony: Apakah perusahaan Anda pernah berpikir untuk menginstal OS yang lebih baru dan kemudian menginstal VMWare atau Virtual Box? Agak terlambat untuk Windows 7 - tetapi Microsoft memberikan penginstalan Windows XP virtual yang memungkinkan Anda untuk beralih antara 7 & XP. Hanya pemikiran saja. :-)
Mark Manning
@MarkManning itu tidak ada dalam kendali kami. Itu digunakan di tempat lain.
Justin Pihony
1
@JustinPihony: Ah. Hmmmmm ...... satu-satunya saran saya yang lain adalah kluge. Menangkap versi OS dan kemudian mengatur semua fungsi di kelas Anda untuk dimasukkan ke dalam array (atau array). Memiliki satu array (atau bagian dari sebuah array) untuk XP dan yang lainnya untuk OS yang lebih baru. Maka yang Anda butuhkan hanyalah beberapa jenis variabel global yang digunakan untuk menunjukkan set mana yang akan digunakan. Semua panggilan bisa sama (atau terlihat sama) tetapi satu set menggunakan NET40_ <FUNCTION> dan yang lainnya bisa menggunakan NET45_ <FUNCTION>. Ini akan menjadi panggilan tidak langsung ke fungsi itu sendiri. Apakah itu masuk akal?
Mark Manning
21

Sayangnya, tidak, Anda tidak dapat menjalankan program 4,5 di XP.

Dan posting yang relevan dari halaman Connect itu:

Diposting oleh Microsoft pada 23/03/2012 di 10:39
Terima kasih atas laporannya. Perilaku ini dengan desain di .NETFramework 4,5 Beta. Sistem operasi minimum yang didukung adalah Windows 7, Windows Server 2008 SP2 dan Windows Server 2008 R2 SP1. Windows XP bukanlah sistem operasi yang didukung untuk rilis Beta.

Oztaco - Kembalikan Monica C.
sumber
8

Proyek Mono menjatuhkan dukungan Windows XP dan "lupa" untuk menyebutkannya. Meskipun mereka masih mengklaim Windows XP SP2 adalah versi minimum yang didukung, sebenarnya itu adalah Windows Vista.

Versi terakhir Mono yang mendukung Windows XP adalah 3.2.3.

tamu
sumber
7

Coba mono:

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

Unduhan ini bekerja pada semua versi Windows XP, 2003, Vista dan Windows 7.

luiseduardohd
sumber
2
Mono lebih lambat dari .NET, dan meskipun memiliki sebagian besar fitur .NET 4.5, ia kekurangan komponen utama tertentu seperti WPF ( mono-project.com/Compatibility ). Jadi, Anda dapat menggunakan dukungan Mono untuk XP jika ia menyediakan semua yang Anda butuhkan, dan Anda baik-baik saja dengan implikasi kinerjanya. Di sisi positifnya, tidak perlu membuat "Mono build" khusus, build normal .NET 4.5 biasanya berfungsi di bawah Mono, tetapi Anda perlu menguji terhadap Mono secara khusus untuk memastikan Anda kompatibel.
Qwertie
2
Saya sudah mencoba mono-3.12.1-gtksharp-2.12.26-win32-0.msi di bawah Windows XP SP3 dan gagal dengan "mono.exe bukan aplikasi Win32 yang valid" . Saya juga mencoba mono-3.0.10-gtksharp-2.12.11-win32-0.exe yang gagal dengan "mono.exe - Titik Masuk Tidak Ditemukan. Titik masuk prosedur InterlockedCompareExchange64 tidak dapat ditemukan di pustaka tautan dinamis KERNEL32 .dll " .
Cristian Ciupitu