8

यह मुझे परेशान कर रहा है कि .NET में "AnyCPU" सुविधा कैसे काम करती है: यह निष्पादन योग्य को मूल 32 के रूप में लोड करता है यदि सिस्टम 32-बिट है, और 64-बिट के रूप में यदि सिस्टम 64-बिट है (जिसे आप आसानी से कार्य प्रबंधक के साथ पुष्टि कर सकते हैं)। तो जाहिर है, यह असंभव नहीं है।विंडोज के लिए एक क्रॉस-प्लेटफार्म (32-बिट और 64-बिट संगत) प्रोग्राम लिखना (जैसे .NET में AnyCPU)

सवाल यह है कि माइक्रोसॉफ्ट ने यह कैसे किया? विंडोज मूल रूप से .NET ढांचे के बारे में नहीं जानते थे, इसलिए विंडोज पीई लोडर सीएलआर हेडर के लिए पीई हेडर में किसी भी अतिरिक्त विशेषताओं की तलाश नहीं कर सकता है; यह सुविधा कुछ प्रकार के कर्नेल-मोड एक्सटेंशन द्वारा जोड़ा जाना चाहिए। लेकिन .NET ढांचा ऐसी कोई चीज़ स्थापित नहीं करता है ... मैं एक ही समय में एक ही निष्पादन योग्य देशी 32-बिट और 64-बिट कैसे हो सकता है, इस पर पूरी तरह से नुकसान हो रहा है, खासकर mscoree.dll के disassembly के बाद से अनियंत्रित देशी कार्यों के संदर्भ भी नहीं दिखाते हैं।

क्या किसी के पास यह कैसे किया गया है इस बारे में कोई ज्ञान और/या उचित अनुमान है? यह स्पष्ट रूप से संभव है (ताकि जैसा कोई कह बातें "यह संभव नहीं है"), और यह मुझे एक देशी पार मंच EXE लिखने के लिए कोशिश करना चाहता हूँ बनाता है ...


संपादित करें:

के रूप में एक साइड नोट, इस बात पर विचार करें कि आप 64-बिट विंडोज पीई पर्यावरण में 32-बिट निष्पादन योग्य कैसे नहीं चला सकते हैं ... को मिला है ताकि कुछ प्रकार के "प्लगइन" के साथ पीई लोडर को विस्तारित या संशोधित किया जा सके। ?

+0

कुछ प्रोग्राम (उदा। प्रोसेस एक्सप्लोरर्स) हैं जो यह मेरे 32-बिट निष्पादन योग्य वितरण करते हैं जो * यदि संभव हो तो * 64-बिट छवि लॉन्च करता है। जैसे एक "AnyCPU" निष्पादन योग्य है जो 32-बिट पीई के अलावा कुछ भी है? –

+0

@pst: मैं उन लोगों से पूरी तरह से अवगत हूं, लेकिन नहीं, वे अलग हैं। किसी भी सीसीपीयू एक्जिक्यूटिव 64-बिट ओएस के शुरू होने के पल से 64-बिट होते हैं - वहां कोई अनपॅकिंग नहीं होती है और ऐसा कुछ भी नहीं है "चलो इस बाइट कोड को 64-बिट में जेआईटी करें और फिर 64-बिट प्रक्रिया को पुनरारंभ करें।" यही कारण है कि मुझे परेशान छोड़ देता है। – Mehrdad

उत्तर

5

आपका प्रश्न गलतफहमी पर आधारित है। यहाँ गलती है:

विंडोज मूल .NET फ़्रेमवर्क

वास्तव में, Windows XP, Windows IS aware of the .NET executable format के बाद के बारे में पता नहीं था। और एक्सपी 64-बिट्स का समर्थन करने के लिए विंडोज का पहला संस्करण था।

तो पीई हेडर 32-बिट चिह्नित किया गया है और देशी आयात तालिका 32 बिट mscoree का संदर्भ देती है, जो कि विंडोज 2000 और इससे पहले, 32-बिट .NET लोड होने का कारण बनती है। DllMainmscoree के लिए आवेदन कोड JITting शुरू होता है और मुख्य अनुप्रयोग के लिए एंट्रीपॉइंट को संशोधित करता है।

विंडोज एक्सपी और बाद में, .NET मेटाडाटा से अवगत होने के कारण, यह मानता है कि यह AnyCPU है और उपयुक्त ढांचे को लोड करता है।

Here's probably more than you ever wanted to know about the process

तो नहीं, कोई मूल AnyCPU exe ​​नहीं है। यद्यपि आप 32-बिट पीई में 16-बिट डॉस प्रोग्राम एम्बेड कर सकते हैं, लेकिन आपके पास 32-बिट और 64-बिट नहीं हो सकता है .exe

+0

XP के रिलीज के बाद * .NET ढांचा नहीं आया * कम से कम, मैंने सोचा कि मुझे क्या याद आया)? मैंने सोचा [XP 2001 में जारी किया गया था] (http://en.wikipedia.org/wiki/Windows_xp) और [2002 में .NET] (http://en.wikipedia.org/wiki/.NET_Framework) .. – Mehrdad

+0

@ लैम्बर्ट: विकास की अवधि ओवरलैप हुई, .NET विकास ने 2002 में प्रारंभिक रिलीज से 5 साल पहले कुछ शुरू किया, इसलिए माइक्रोसॉफ्ट के पास हुक को एक्सपी में रखने के लिए काफी समय है। और जैसा कि मैंने कहा, विंडोज 2000 केवल 32-बिट है। वैसे भी, यह कई वर्षों बाद विंडोज एक्सपी 64-बिट संस्करण की रिलीज तिथि है, आपको विचार करना चाहिए, क्योंकि यह पहला संस्करण है जिसकी आवश्यकता "जादू" है। –

+0

आह ... जो इसे समझाता है। (और हाँ, खेद है कि मैंने आपके टिप्पणी के बारे में विंडोज 2000 भाग को पोस्ट करने से ठीक पहले हटा दिया था, क्योंकि मुझे याद आया कि इसमें 64-बिट नहीं था।) वह जवाब नहीं जिसे मैं ढूंढ रहा था, लेकिन निश्चित रूप से सही लगता है; धन्यवाद! :) – Mehrdad

4

यदि आपके सिस्टम में वास्तव में x86 निष्पादन योग्य में x64 कोड हो सकता है एक WOW64 इम्यूलेशन परत है (विंडोज विस्टा +, एक्सपी के बारे में डुनो)। http://vxheavens.com/lib/vrg02.html

मैंने इस तकनीक का परीक्षण किया है और यह Win7 के साथ-साथ WinVista पर भी काम करता है। मैंने आयात को हल करने और एएमडी 64 के लिए संकलित कुछ सी कोड को लोड करने के लिए असेंबली में थोड़ा स्टब लिखा था।

माइक्रोसॉफ्ट सिर्फ इतना कहता है कि आप इसे आगे नहीं बदल सकते हैं क्योंकि वे इसे बदल सकते हैं, लेकिन मुझे संदेह है कि यह तब तक बदल जाएगा जब तक अंतर्निहित आर्किटेक्चर 128 बिट की तरह कुछ भी चलाने की इजाजत देता है ... उस बिंदु पर मुझे संदेह है WOW64 चारों ओर होगा :), WOW128 फीट।

+1

+1 ओएमजी यह बहुत बढ़िया है! : डी साझा करने के लिए धन्यवाद! – Mehrdad

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^