2008-09-24 20 views
39

से 32 बिट कोड को कॉल करना मेरे पास एक ऐसा एप्लिकेशन है जिसे हम 32 बिट से 64 बिट पर माइग्रेट करने का प्रयास कर रहे हैं। यह .NET है, x64 झंडे का उपयोग करके संकलित। हालांकि, हमारे पास 32 बिट के लिए संकलित फोरट्रान 90 में लिखे गए बड़ी संख्या में डीएलएल हैं। फोरट्रान डीएलएल में कार्य काफी सरल हैं: आप डेटा डालते हैं, आप डेटा खींचते हैं; किसी भी तरह की स्थिति नहीं है। हम वहां बहुत समय व्यतीत नहीं करते हैं, कुल 3%, लेकिन गणना तर्क यह निष्पादन योग्य है।64 बिट प्रक्रिया

क्या मैं 64 बिट कोड से 32 बिट डीएलएल को किसी भी तरह कॉल कर सकता हूं? एमएसडीएन सुझाव देता है कि मैं नहीं कर सकता, अवधि। मैंने कुछ सरल हैकिंग की है और इसे सत्यापित किया है। सब कुछ एक अवैध प्रविष्टि बिंदु अपवाद फेंकता है। मुझे अब तक का एकमात्र संभावित समाधान 32 बिट डीएलएल कार्यों के लिए COM + wrappers बनाना है और 64 बिट प्रक्रिया से COM को आमंत्रित करना है। यह काफी सिरदर्द की तरह लगता है। हम वाह इम्यूलेशन में भी प्रक्रिया को चला सकते हैं, लेकिन फिर मेमोरी छत में वृद्धि नहीं की जाएगी, लगभग 1.6 जीबी पर कैपिंग।

क्या 64 बिट सीएलआर प्रक्रिया से 32 बिट डीएलएल को कॉल करने का कोई अन्य तरीका है?

उत्तर

32

आपको 32-बिट डीएल को एक अलग 32-बिट प्रक्रिया में लोड करने की आवश्यकता होगी, और आपकी 64 बिट प्रक्रिया इंटरप्रोसेस संचार के माध्यम से इसके साथ संवाद करेगी। मुझे नहीं लगता कि 32 बिट बिट डीएल को किसी अन्य तरीके से 64 बिट प्रक्रिया में लोड किया जा सकता है।

वहाँ एक बहुत अच्छी यहाँ लेख है:

Accessing 32-bit DLLs from 64-bit code

+0

यह 64 बिट है -> COM -> 32 बिट चीज़ जो मैं वर्णन कर रहा था। उस लेख को पढ़ने और नमूने को काम करने की कोशिश करने के बाद, मैंने फैसला किया कि _got_ बेहतर तरीका बनने के लिए है। कम से कम मुझे ऐसी आशा है। –

+3

जॉन का जवाब सही है। एक प्रक्रिया में 32-बिट और 64-बिट मॉड्यूल मिश्रित करने का कोई तरीका नहीं है। आपको दूसरी प्रक्रिया शुरू करने की जरूरत है। यहां मेरा उत्तर भी देखें: http://stackoverflow.com/questions/6523075/how-to-force-net-application-to-run-in-32bit-mode/6533556#6533556 –

+2

आपको जरूरी उपयोग करने की आवश्यकता नहीं है COM + wrappers, लेकिन आपको 32-बिट प्रक्रिया का उपयोग करने की आवश्यकता है। –

1

के रूप में 32-बिट प्रक्रियाओं (बनाम किसी भी CPU या 64) इतना है कि वे के लिए WoW32 के साथ भरी हुई हो जाएगा आप अपने निष्पादन प्रक्रियाओं लिखने की ज़रूरत विस्टा। यह उन्हें 32-बिट इम्यूलेशन मोड में लोड करेगा और आपके पास एंट्री पॉइंट समस्या नहीं होगी। आप किसी भीCPCP मोड में आपको पुस्तकालय छोड़ सकते हैं, लेकिन आपके निष्पादन योग्य को x86 के रूप में संकलित करना होगा।

+1

ऐसा लगता है जैसे उन्होंने इसे माना है, लेकिन बढ़ी हुई स्मृति छत की आवश्यकता है 64-बिट ऑफ़र –

+0

एक आधा सत्य है: 32 बिट प्रक्रियाएं x64 मशीन पर चलती हैं यदि आप उन्हें x86 के रूप में संकलित करते हैं। लेकिन यदि आपका निष्पादन योग्य x86 है और आपके पुस्तकालय AnyCPU हैं - बस समय संकलक में से उनमें से x64 कोड बना देगा जो उन्हें (32 बिट) निष्पादन योग्य के साथ असंगत बनाता है। तो, ** असेंबली ** सहित सब कुछ या तो x86 या AnyCPU होना चाहिए। – Matt

0

जॉन का उत्तर सही है यदि आप अपने मौजूदा डीएलएस को पुन: संकलित नहीं करना चाहते हैं; हालांकि यह आपके लिए भी एक विकल्प हो सकता है।

हमारी टीम वर्तमान में मेमोरी छत को बढ़ाने के लिए x64 पर हमारे x86 FORTRAN कोड माइग्रेट कर रही है।

+0

यह तब तक काम करता है जब तक आपके पास 32 बिट तृतीय पक्ष असेंबली नहीं है (स्रोत कोड के बिना) आपको संदर्भ के रूप में जोड़ने की आवश्यकता है ... – Matt