2010-03-04 13 views
5

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

मेरा प्रश्न है: क्या 32 बिट डीएलएल का उपयोग करने का कोई तरीका है? यदि नहीं, अगर मैंने डीएलएल का 64 बिट संस्करण बनाया है, तो क्या यह एप्लिकेशन को चुनने के लिए आसानी से संभव होगा कि कौन सा पी/इनके लिए आमंत्रित किया जाए?

मैं सी # में दो सहायक वर्ग बनाने की सोच रहा हूं: एक जो 32 बिट डीएलएल से काम करता है और 64 बिट डीएलएल से आयात करता है, फिर प्रत्येक आयातित फ़ंक्शन के लिए एक फ़ंक्शन के साथ एक रैपर क्लास बनाते हैं जो या तो कॉल करता है ओएस के "बिटीनेस" के आधार पर 32 बिट आयातक या 64 बिट आयातक। क्या इससे काम हो जायेगा?

या चीजों को करने का एक और आसान तरीका है?

उत्तर

6

आपको यह सुनिश्चित करने की ज़रूरत है कि आप केवल 64 बिट में संकलित करते समय 64 बिट डीएलएल के खिलाफ पी/इनवॉक कॉल का उपयोग कर रहे हैं।

एक विकल्प अपने सभी "विधियों" को एक मानक इंटरफ़ेस (या सार आधार श्रेणी) में स्थानांतरित करना है, और 2 कार्यान्वयन, एक 32 बिट और एक 64 बिट प्रदान करना है। इंटिप्ट के आकार के आधार पर आप एक फैक्ट्री विधि कक्षा के उपयुक्त उदाहरण का निर्माण कर सकते हैं।

यह रनटाइम पर "AnyCPU" ऐप को सही ढंग से करने की अनुमति देता है, यह निर्धारित करता है कि कौन सी डीएलएल पी/इनके अंदर आती है, और काम करती है।

+0

मैंने इस उत्तर को स्वीकार्य समाधान अब चिह्नित किया है, जैसा कि मैंने किया है प्रश्न पूछने के बाद से सफलतापूर्वक किया गया। –

1

आप झंडा केवल लक्ष्य 86 आर्किटेक्चर

+0

हां, यह काम करता है, हम कोशिश की है, लेकिन निश्चित रूप से मैं जब 64 बिट सिस्टम पर आवेदन 64 बिट मोड में चलाना चाहते हैं। –

+0

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

+0

पर कॉल करना है, इसलिए मूल रूप से आप कह रहे हैं कि मेरे प्रश्न में मैंने जो सुझाव दिया वह रास्ता है? –

1

लिए नेट अनुप्रयोग मैं इसी तरह की समस्या थी, लेकिन यह Unrar.dll किया जा रहा है या तो 32 या 64 बिट के साथ था कर सकते हैं।

यह काम करने के लिए दो दृष्टिकोण हो सकते हैं:

एक)

#if x64 
// ... define all x64 imports here 
#else 
// ... define all x86 imports here 
#endif 

और 32bit और 64bit के लिए आवेदन संकलित करें।

बी) आयात के लिए एक इंटरफ़ेस बनाने और 32 बिट और 64 बिट संस्करणों को अलग-अलग लागू करने का एक और तरीका था।

यदि 32 बिट, 32 बिट कार्यान्वयन को तुरंत चालू करें, तो 64 बिट कार्यान्वयन को तुरंत चालू करें।

+0

हां, हम ऐसा कर सकते हैं, लेकिन निश्चित रूप से यह दोनों प्लेटफार्मों के लिए संकलन के बारे में सोचने के लिए अच्छा नहीं होगा ... –

3

एक सहायक वर्ग बनाएं जो 64 बिट और 32 बिट डीएलएलएस दोनों को लपेटता है, और यह निर्धारित करने के लिए IntPtr.Size का उपयोग करें।

if (IntPtr.Size == 8) 
{ 
    Helper.SomeMethod64(); 
} 
else 
{ 
    Helper.SomeMethod32(); 
} 
संबंधित मुद्दे