क्या XP पर .NET 4.5 ऐप चलाना संभव है?


86

सबसे पहले, मैंने निम्नलिखित पढ़ा है:

इसलिए, आखिरी गोली से, मुझे वास्तव में लगता है कि इसके आसपास कोई रास्ता नहीं है, लेकिन मुझे यह देखना था कि क्या मुझे एक निश्चित उत्तर मिल सकता है क्योंकि मेरी टीम .NET 4.0 से .NET 4.5 में अपग्रेड करना चाहेगी। हालाँकि, हमें XP का समर्थन करना होगा।

अगर हम XP का समर्थन करना चाहते हैं तो क्या .NET 4.5 में जाने की कोई संभावना नहीं है?

केवल एक चीज जिसके बारे में मैं सोच सकता था, वह दो अलग-अलग समाधान तैयार कर रही है, लेकिन तब कोडबेस को अलग करना होगा यदि हमने .NET 4.5 सुविधाओं का उपयोग किया है।

इसलिए, मैं कुछ आश्चर्यजनक वर्कआउट की तलाश कर रहा हूं जो मुझे नहीं मिला और अन्य शायद पहले से ही जानते हैं।


9
नहीं, आप नहीं कर सकते। जब तक XP निश्चित रूप से मर जाता है तब तक 4.0 से चिपके रहें।
फेडेरिको बेरासैटुई

जवाबों:


187

मैं इस उत्तर को पोस्ट करने में संकोच करता हूं, यह वास्तव में तकनीकी रूप से संभव है लेकिन यह व्यवहार में अच्छी तरह से काम नहीं करता है। सीएलआर और कोर फ्रेमवर्क असेंबलियों के संस्करण संख्याओं को 4.5 में नहीं बदला गया था। आप अभी भी CL4 के v4.0.30319 को लक्षित करते हैं और फ्रेमवर्क असेंबली संस्करण संख्याएँ 4.0.0.0 हैं। केवल एक चीज जो असेंबली मेनिफ़ेस्ट के बारे में विशिष्ट है जब आप इसे एक डिस्क्लेमर के साथ देखते हैं जैसे ildasm.exe एक [TargetFramework] विशेषता की उपस्थिति है जो कहती है कि 4.5 की आवश्यकता है, जिसे बदलना होगा। वास्तव में यह आसान नहीं है, यह संकलक द्वारा उत्सर्जित होता है।

सबसे बड़ा अंतर यह नहीं दिखाई देता है, Microsoft ने असेंबलियों के निष्पादन योग्य हेडर में लंबे समय तक बदलाव किया। जो निर्दिष्ट करता है कि निष्पादन योग्य विंडोज के किस संस्करण के साथ संगत है। XP विंडोज की पिछली पीढ़ी से संबंधित है, जिसे विंडोज 2000 के साथ शुरू किया गया था। उनकी प्रमुख संस्करण संख्या 5. विस्टा वर्तमान पीढ़ी की शुरुआत थी, प्रमुख संस्करण 6।

.NET कंपाइलरों ने हमेशा न्यूनतम संस्करण संख्या को 4.00, Windows NT और Windows 9x के संस्करण के रूप में निर्दिष्ट किया है। आप असेंबली पर डंपबिन.नेट / हेडर चलाकर इसे देख सकते हैं। नमूना उत्पादन इस तरह दिखता है:

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 में बदल देते हैं। एक बदलाव जो बड़े हिस्से में अधिक था, क्योंकि विंडोज उस नंबर पर ध्यान देता है, अगर यह पर्याप्त छोटा है, तो जांचने से परे। यह appcompat सुविधाओं को भी चालू करता है क्योंकि यह मानता है कि प्रोग्राम विंडोज के पुराने संस्करणों पर काम करने के लिए लिखा गया था। इन विशेषताओं के कारण परेशानी होती है, विशेष रूप से जिस तरह से एयरो में एक विंडो के आकार के बारे में झूठ है वह परेशानी है। यह एयरो विंडो की वसा सीमाओं के बारे में झूठ बोलना बंद कर देता है जब यह देख सकता है कि प्रोग्राम को एयरो के विंडोज संस्करण पर चलने के लिए डिज़ाइन किया गया था।

आप उस संस्करण संख्या में परिवर्तन कर सकते हैं और इसे / सबसिस्टम विकल्प के साथ अपनी असेंबली पर Editbin.exe चलाकर वापस 4.00 पर सेट कर सकते हैं। यह उत्तर एक नमूना पोस्टबिल्ड घटना दिखाता है।

हालांकि, जहां अच्छी खबर समाप्त होती है, उसके बारे में एक महत्वपूर्ण समस्या यह है कि .NET 4.5 .NET 4.0 के साथ बहुत संगत नहीं है। अब तक सबसे बड़ी हैंग-अप यह है कि वर्गों को एक विधानसभा से दूसरे में स्थानांतरित किया गया था। सबसे विशेष रूप से, यह [एक्सटेंशन] विशेषता के लिए हुआ। पहले System.Core.dll में, यह .NET 4.5 में Mscorlib.dll में स्थानांतरित हो गया। यदि आप अपने स्वयं के विस्तार के तरीकों की घोषणा करते हैं, तो XP पर एक काबूम है, आपका प्रोग्राम विशेषता के लिए Mscorlib में देखने के लिए कहता है, जो System.Core संदर्भ विधानसभा के .NET 4.5 संस्करण में [TypeForwardedTo] विशेषता द्वारा सक्षम है। लेकिन ऐसा नहीं है जब आप .NET 4.0 पर अपना प्रोग्राम चलाते हैं

और निश्चित रूप से ऐसा कुछ भी नहीं है जो आपको केवल .NET 4.5 पर उपलब्ध कक्षाओं और विधियों का उपयोग करने से रोकने में मदद करता है। जब आप करते हैं, तो 4.0 पर चलने पर आपका प्रोग्राम TypeLoadException या MissingMethodException के साथ विफल हो जाएगा

बस लक्ष्य 4.0 और ये सभी समस्याएं गायब हो जाती हैं। या उस लॉगजैम को तोड़ दें और XP का समर्थन करना बंद कर दें, एक व्यावसायिक निर्णय जो प्रोग्रामर अक्सर नहीं कर सकते हैं लेकिन निश्चित रूप से इसके कारण होने वाली परेशानियों को इंगित करके प्रोत्साहित कर सकते हैं। प्राचीन ऑपरेटिंग सिस्टम का समर्थन करने के लिए निश्चित रूप से एक गैर-शून्य लागत है, बस परीक्षण का प्रयास पर्याप्त है। एक लागत जिसे अक्सर प्रबंधन द्वारा मान्यता प्राप्त नहीं किया जाता है, विंडोज संगतता पौराणिक है, जब तक कि यह उन्हें इंगित नहीं किया जाता है। फॉरवर्ड करें कि ग्राहक को लागत और वे सही निर्णय बहुत तेज करते हैं :) लेकिन हम आपकी मदद नहीं कर सकते।


2
धन्यवाद हंस, मुझे लगा कि कुछ टूटने वाले बदलाव थे। मैं वर्कअराउंड की भी सराहना करता हूं। आपके द्वारा निर्दिष्ट कारणों के लिए हम इसके साथ नहीं जा सकते, लेकिन यह जानना अच्छा है। शायद XP किसी दिन अच्छे के लिए चली जाएगी ....
जस्टिन पिहोनी

3
just the testing effort is substantial- यही कारण है कि "XP समर्थन ड्रॉप करने की अनुमति" के लिए हमारा प्रबंधन मिला।
क्रिस्टोफ फिंक

मुझे पता है कि यह एक पुरानी पोस्टिंग है - लेकिन - @JustinPihony: क्या आपकी कंपनी ने कभी बाद में ओएस स्थापित करने और फिर VMWare या वर्चुअल बॉक्स स्थापित करने के बारे में सोचा है? विंडोज 7 के लिए थोड़ा देर हो चुकी है - लेकिन माइक्रोसॉफ्ट ने एक वर्चुअल विंडोज एक्सपी स्थापित किया जिसने आपको 7 और एक्सपी के बीच टॉगल करने की अनुमति दी। सिर्फ एक विचार। :-)
मार्क मैनिंग

@MarkManning यह हमारे नियंत्रण में नहीं था। इसका अन्यत्र उपयोग किया जा रहा था।
जस्टिन पिहोनी

1
@JustinPihony: आह। हम्म्म्म …… मेरा केवल एक और सुझाव है एक kluge। OS संस्करण को कैप्चर करें और फिर अपनी कक्षाओं में सभी फ़ंक्शंस को एरेज़ (या एरे) में सेट करने के लिए सेट करें। एक सरणी (या एक सरणी का हिस्सा) XP के लिए और दूसरा नए OS के लिए होना चाहिए। फिर आपको केवल कुछ प्रकार के वैश्विक चर की आवश्यकता होती है, जिसका उपयोग यह बताने के लिए किया जाता है कि कौन सा उपयोग करना है। कॉल सभी समान हो सकती हैं (या समान दिखती हैं) लेकिन एक सेट NET40_ <FUNCTION> का उपयोग करता है और अन्य NET45_ <FUNCTION> का उपयोग कर सकते हैं। यह फ़ंक्शन के लिए एक अप्रत्यक्ष कॉल होगा। क्या इसका कोई मतलब है?
मार्क मैनिंग

21

अफसोस की बात है, नहीं, आप XP पर 4.5 प्रोग्राम नहीं चला सकते।

और उस कनेक्ट पेज से प्रासंगिक पोस्ट:

Microsoft द्वारा 23/03/2012 को 10:39 पर पोस्ट किया
गया रिपोर्ट के लिए धन्यवाद। यह व्यवहार .NET फ्रेमवर्क 4.5 बीटा में डिज़ाइन द्वारा है। न्यूनतम समर्थित ऑपरेटिंग सिस्टम विंडोज 7, विंडोज सर्वर 2008 SP2 और विंडोज सर्वर 2008 R2 SP1 हैं। Windows XP बीटा रिलीज़ के लिए समर्थित ऑपरेटिंग सिस्टम नहीं है।


8

मोनो परियोजना ने विंडोज एक्सपी समर्थन को गिरा दिया और इसका उल्लेख करने के लिए "भूल गया" । हालाँकि वे अभी भी दावा करते हैं कि Windows XP SP2 न्यूनतम समर्थित संस्करण है, यह वास्तव में Windows Vista है।

Windows XP का समर्थन करने के लिए मोनो का अंतिम संस्करण 3.2.3 था।


7

मोनो की कोशिश करो:

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

यह डाउनलोड विंडोज एक्सपी, 2003, विस्टा और विंडोज 7 के सभी संस्करणों पर काम करता है।


2
मोनो .NET की तुलना में धीमा है, और इसमें .NET 4.5 की अधिकांश विशेषताएं हैं, लेकिन इसमें WPF ( mono-project.com/Compatibility ) जैसे कुछ प्रमुख घटकों का अभाव है । तो आप XP समर्थन के लिए मोनो का उपयोग कर सकते हैं यदि यह आपको वह सब प्रदान करता है जिसकी आपको आवश्यकता है, और आप प्रदर्शन निहितार्थ के साथ ठीक हैं। प्लस साइड पर, एक विशेष "मोनो बिल्ड" बनाने की आवश्यकता नहीं होनी चाहिए, सामान्य .NET 4.5 बिल्ड आम तौर पर मोनो के तहत काम करता है, लेकिन आपको यह सुनिश्चित करने के लिए विशेष रूप से मोनो के खिलाफ परीक्षण करने की आवश्यकता है कि आप संगत हैं।
क्वर्टी

2
मैंने Windows XP SP3 के तहत मोनो-3.12.1-gtksharp-2.12.26-win32-0.msi की कोशिश की है और यह "mono.exe एक वैध Win32 अनुप्रयोग नहीं है" के साथ विफल रहा । मैंने मोनो-3.0.10-gtksharp-2.12.11-win32-0.exe भी आज़माया है, जो "mono.exe - एंट्री प्वाइंट नहीं मिला। प्रक्रिया प्रविष्टि बिंदु InterlockedCompareExchange64 डायनेमिक लाइब्रेरी KERNEL32 में स्थित नहीं हो सकता है। .dll ”
क्रिस्टियन सियुपिटु

4

विंडोज़ XP (SP3) का समर्थन करने के लिए अंतिम संस्करण मोनो-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi है और यह .NET 4.5 को प्रतिस्थापित नहीं करता है, लेकिन कुछ अनुप्रयोगों के लिए रुचि का हो सकता है।

वहाँ देखें: https://download.mono-project.com/archive/4.3.2/windows-installer/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.