เป็นไปได้หรือไม่ที่จะเรียกใช้แอพ. NET 4.5 บน XP?


86

ก่อนอื่นฉันได้อ่านสิ่งต่อไปนี้:

ดังนั้นจากสัญลักษณ์แสดงหัวข้อย่อยสุดท้ายฉันคิดว่าไม่มีทางเกิดขึ้นได้ แต่ฉันต้องดูว่าฉันจะได้รับคำตอบที่ชัดเจนหรือไม่เนื่องจากทีมของฉันต้องการอัปเกรดจาก. NET 4.0 เป็น. NET 4.5 อย่างไรก็ตามเราต้องรองรับ XP

ไม่มีความเป็นไปได้ที่จะไปที่. NET 4.5 หากเราต้องการรองรับ XP?

สิ่งเดียวที่ฉันคิดได้คือการสร้างโซลูชันสองแบบแยกกัน แต่โค้ดเบสจะต้องแตกต่างกันถ้าเราใช้คุณสมบัติ. NET 4.5

ดังนั้นฉันกำลังมองหาวิธีแก้ปัญหาที่น่าทึ่งบางอย่างที่ฉันไม่พบและคนอื่น ๆ อาจจะรู้แล้ว


9
ไม่คุณทำไม่ได้ ติด 4.0 จนกว่า XP จะตายแน่นอน
Federico Berasategui

คำตอบ:


188

ฉันลังเลที่จะโพสต์คำตอบนี้มันเป็นไปได้จริงในทางเทคนิค แต่มันไม่ได้ผลดีในทางปฏิบัติ หมายเลขเวอร์ชันของ CLR และชุดประกอบกรอบงานหลักไม่มีการเปลี่ยนแปลงใน 4.5 คุณยังคงกำหนดเป้าหมาย v4.0.30319 ของ CLR และหมายเลขเวอร์ชันแอสเซมบลีของเฟรมเวิร์กยังคงเป็น 4.0.0.0 สิ่งเดียวที่โดดเด่นเกี่ยวกับรายการประกอบเมื่อคุณดูด้วย disassembler เช่น ildasm.exe คือการมีแอตทริบิวต์ [TargetFramework] ที่ระบุว่าจำเป็นต้องใช้ 4.5 ซึ่งจะต้องมีการเปลี่ยนแปลง ไม่ง่ายอย่างนั้นจริง ๆ มันถูกปล่อยออกมาโดยคอมไพเลอร์

ความแตกต่างที่ใหญ่ที่สุดไม่สามารถมองเห็นได้ Microsoft ได้ทำการเปลี่ยนแปลงส่วนหัวที่ปฏิบัติการได้ของแอสเซมบลีที่ค้างชำระเป็นเวลานาน ซึ่งระบุเวอร์ชันของ Windows ที่สามารถปฏิบัติการได้ XP เป็นของ Windows รุ่นก่อนหน้าเริ่มต้นด้วย Windows 2000 หมายเลขเวอร์ชันหลักคือ 5 Vista คือจุดเริ่มต้นของรุ่นปัจจุบันซึ่งเป็นเวอร์ชันหลักหมายเลข 6

คอมไพเลอร์. NET มักจะระบุหมายเลขเวอร์ชันขั้นต่ำเป็น 4.00 เวอร์ชันของ Windows NT และ Windows 9x คุณสามารถดูสิ่งนี้ได้โดยการเรียกใช้ dumpbin.exe / headers บนแอสเซมบลี ผลลัพธ์ตัวอย่างมีลักษณะดังนี้:

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 คือคอมไพเลอร์เปลี่ยนเวอร์ชันของระบบย่อยเป็น 6.00 การเปลี่ยนแปลงที่เกินกำหนดส่วนใหญ่เนื่องจาก Windows ให้ความสำคัญกับตัวเลขนั้นนอกเหนือจากการตรวจสอบว่ามีขนาดเล็กเพียงพอหรือไม่ นอกจากนี้ยังเปิดใช้งานคุณสมบัติของ appcompat เนื่องจากถือว่าโปรแกรมถูกเขียนขึ้นเพื่อทำงานบน Windows เวอร์ชันเก่า คุณสมบัติเหล่านี้ทำให้เกิดปัญหาโดยเฉพาะอย่างยิ่งวิธีที่ Windows ตั้งอยู่เกี่ยวกับขนาดของหน้าต่างใน Aero นั้นลำบาก หยุดโกหกเกี่ยวกับขอบไขมันของหน้าต่าง Aero เมื่อเห็นว่าโปรแกรมได้รับการออกแบบให้ทำงานบน Windows เวอร์ชันที่มี Aero

คุณสามารถเปลี่ยนหมายเลขเวอร์ชันและตั้งค่ากลับเป็น 4.00 ได้โดยเรียกใช้ Editbin.exe บนแอสเซมบลีของคุณด้วยตัวเลือก / subsystem คำตอบนี้แสดงเหตุการณ์ postbuild ตัวอย่าง

อย่างไรก็ตามเมื่อข่าวดีสิ้นสุดลงปัญหาสำคัญคือ. NET 4.5 ไม่สามารถใช้งานร่วมกับ. NET 4.0 ได้มากนัก การวางสายที่ใหญ่ที่สุดคือการย้ายชั้นเรียนจากที่หนึ่งไปยังอีกที่หนึ่ง สิ่งที่น่าสังเกตที่สุดคือเกิดขึ้นกับแอตทริบิวต์ [ส่วนขยาย] ก่อนหน้านี้ใน System.Core.dll ได้ย้ายไปยัง Mscorlib.dll ใน. NET 4.5 นั่นคือ kaboom บน XP หากคุณประกาศวิธีการขยายของคุณเองโปรแกรมของคุณจะบอกว่าให้ค้นหาใน Mscorlib สำหรับแอตทริบิวต์ที่เปิดใช้งานโดยแอตทริบิวต์ [TypeForwardedTo] ในแอสเซมบลีการอ้างอิง System.Core เวอร์ชัน. NET 4.5 แต่จะไม่มีเมื่อคุณรันโปรแกรมบน. NET 4.0

และแน่นอนว่าไม่มีอะไรที่ช่วยให้คุณหยุดใช้คลาสและวิธีการที่มีเฉพาะบน. NET 4.5 เมื่อคุณทำโปรแกรมของคุณจะล้มเหลวด้วย TypeLoadException หรือ MissingMethodException เมื่อรันบน 4.0

เพียงแค่ตั้งเป้า 4.0 และปัญหาเหล่านี้จะหมดไป หรือทำลาย logjam นั้นและหยุดสนับสนุน XP ซึ่งเป็นการตัดสินใจทางธุรกิจที่โปรแกรมเมอร์ไม่สามารถทำได้บ่อยครั้ง แต่สามารถให้กำลังใจได้อย่างแน่นอนโดยชี้ให้เห็นถึงความยุ่งยากที่ก่อให้เกิด แน่นอนว่ามีค่าใช้จ่ายที่ไม่ใช่ศูนย์ในการสนับสนุนระบบปฏิบัติการแบบเก่าเพียงแค่ความพยายามในการทดสอบก็มีมาก ค่าใช้จ่ายที่ฝ่ายบริหารมักไม่ได้รับการยอมรับความเข้ากันได้ของ Windows เป็นตำนานเว้นแต่จะมีการชี้ให้เห็น ส่งต่อค่าใช้จ่ายดังกล่าวให้กับลูกค้าและพวกเขามักจะตัดสินใจได้ถูกต้องเร็วกว่ามาก :) แต่เราไม่สามารถช่วยคุณได้


2
ขอบคุณฮันส์ฉันคิดว่ามีการเปลี่ยนแปลงบางอย่างที่ผิดปกติ ฉันขอขอบคุณสำหรับวิธีแก้ปัญหานี้เช่นกัน เราไม่สามารถไปด้วยได้ด้วยเหตุผลที่คุณระบุไว้ แต่เป็นเรื่องดีที่ควรทราบ บางที XP อาจจะหายไปสักวัน ....
Justin Pihony

3
just the testing effort is substantial- นั่นคือสิ่งที่ทำให้เราต้อง "อนุญาตให้วางการสนับสนุน XP"
Christoph Fink

ฉันรู้ว่านี่เป็นการโพสต์เก่า - แต่ - @JustinPihony: บริษัท ของคุณเคยคิดที่จะติดตั้งระบบปฏิบัติการรุ่นหลังแล้วติดตั้ง VMWare หรือ Virtual Box หรือไม่? มันช้าไปหน่อยสำหรับ Windows 7 - แต่ Microsoft ให้การติดตั้ง Windows XP เสมือนจริงซึ่งอนุญาตให้คุณสลับระหว่าง 7 & XP เพียงแค่ความคิด :-)
Mark Manning

@MarkManning มันไม่ได้อยู่ในการควบคุมของเรา มันถูกนำไปใช้ที่อื่น
Justin Pihony

1
@JustinPihony: อ่า อืมมม ...... ข้อเสนอแนะอื่น ๆ ของฉันคือ kluge จับเวอร์ชันของระบบปฏิบัติการจากนั้นตั้งค่าฟังก์ชันทั้งหมดในคลาสของคุณเพื่อใส่ลงในอาร์เรย์ (หรืออาร์เรย์) มีอาร์เรย์หนึ่งชุด (หรือบางส่วนของอาร์เรย์) สำหรับ XP และอีกชุดสำหรับ OS ที่ใหม่กว่า จากนั้นสิ่งที่คุณต้องมีคือตัวแปรส่วนกลางบางประเภทที่ใช้เพื่อระบุว่าจะใช้ชุดใด การโทรอาจเหมือนกันทั้งหมด (หรือดูเหมือนกัน) แต่ชุดหนึ่งใช้ NET40_ <FUNCTION> และชุดอื่น ๆ สามารถใช้ NET45_ <FUNCTION> ได้ นี่จะเป็นการเรียกฟังก์ชันทางอ้อม มันสมเหตุสมผลไหม
Mark Manning

21

น่าเศร้าที่ไม่คุณไม่สามารถเรียกใช้โปรแกรม 4.5 บน XP ได้

และโพสต์ที่เกี่ยวข้องจากหน้าเชื่อมต่อนั้น:

โพสต์โดย Microsoft เมื่อ 23/03/2012 เวลา 10:39
ขอบคุณสำหรับรายงาน ลักษณะการทำงานนี้เกิดจากการออกแบบใน. NET Framework 4.5 Beta ระบบปฏิบัติการขั้นต่ำที่รองรับ ได้แก่ Windows 7, Windows Server 2008 SP2 และ Windows Server 2008 R2 SP1 Windows XP ไม่ใช่ระบบปฏิบัติการที่รองรับสำหรับรุ่นเบต้า


8

โครงการ Mono ยกเลิกการรองรับ Windows XP และ"ลืม" ที่จะพูดถึง แม้ว่าพวกเขายังคงอ้างสิทธิ์ Windows XP SP2 เป็นเวอร์ชันขั้นต่ำที่รองรับ แต่ก็เป็น Windows Vista

เวอร์ชันสุดท้ายของ Mono ที่รองรับ Windows XP คือ 3.2.3


7

ลองโมโน:

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

การดาวน์โหลดนี้ใช้ได้กับ Windows XP, 2003, Vista และ Windows 7 ทุกเวอร์ชัน


2
Mono ช้ากว่า. NET และแม้ว่าจะมีคุณสมบัติส่วนใหญ่ของ. NET 4.5 แต่ก็ไม่มีองค์ประกอบหลักบางอย่างเช่น WPF ( mono-project.com/Compatibility ) ดังนั้นคุณสามารถใช้การสนับสนุน Mono สำหรับ XP ได้หากมีทุกสิ่งที่คุณต้องการและคุณก็โอเคกับผลกระทบด้านประสิทธิภาพ ในด้านบวกไม่จำเป็นต้องสร้าง "Mono build" แบบพิเศษโดยทั่วไปแล้ว. NET 4.5 build จะทำงานภายใต้ Mono แต่คุณต้องทดสอบกับ Mono โดยเฉพาะเพื่อให้แน่ใจว่าคุณเข้ากันได้
Qwertie

2
ฉันได้พยายามโมโน 3.12.1-gtksharp-2.12.26-win32-0.msi ภายใต้ Windows XP SP3 และมันก็ล้มเหลวด้วย"mono.exe ไม่ได้เป็นโปรแกรมประยุกต์ Win32 ที่ถูกต้อง" ฉันได้ลอง mono-3.0.10-gtksharp-2.12.11-win32-0.exe ซึ่งล้มเหลวด้วย"mono.exe - ไม่พบจุดเข้าใช้งานจุดเข้าขั้นตอน InterlockedCompareExchange64 ไม่สามารถอยู่ในไลบรารีลิงก์ไดนามิก KERNEL32 .dll " .
Cristian Ciupitu

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