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