2010-04-07 14 views
8

पर आधारित बाहरी डीएल आयात करें मेरे पास 32 बिट और 64 बिट संस्करण दोनों में एक डीएल है। मेरा .NET WinForm "कोई भी CPU" के लिए कॉन्फ़िगर किया गया है और मेरा मालिक हमें विभिन्न ओएस संस्करणों के लिए अलग-अलग इंस्टॉल नहीं करने देगा। तो मैं सोच रहा हूं: यदि मैं इंस्टॉल में दोनों डीएलएस पैकेज करता हूं, तो WinForm निर्धारित करने का कोई तरीका है कि इसकी 64 बिट/32 बिट और उचित डीएल लोड करें।64 बिट या 32 बिट ओएस

मैं संस्करण का निर्धारण करने के लिए this article पाया। लेकिन मुझे यकीन नहीं है कि मैं जिस विधि का उपयोग करना चाहता हूं, उस पर DLLImport विशेषता को परिभाषित करने के लिए उचित तरीका इंजेक्ट करना है। कोई विचार?

उत्तर

6

आप उन दोनों को आयात और निर्णय के बारे में जो एक नेट के माध्यम से करने के बजाय फोन करने के लिए कर सकते हैं?

उदाहरण के लिए:

[DllImport("32bit.dll", CharSet = CharSet.Unicode, EntryPoint="CallMe")] 
public static extern int CallMe32 (IntPtr hWnd, String text, String caption, uint type); 

[DllImport("64bit.dll", CharSet = CharSet.Unicode, EntryPoint="CallMe")] 
public static extern int CallMe64 (IntPtr hWnd, String text, String caption, uint type); 
+1

वास्तव में यह मेरा "जाने" समाधान है यदि मुझे ऐसा करने के लिए क्लीनर तरीका नहीं मिल रहा है। –

3

आप दो अलग-अलग निजी extern तरीकों बनाना चाहिए, और एक आंतरिक विधि है कि IntPtr.Size जाँच करता है और सही संस्करण कॉल कर।

3

मेरे समाधान एक ठोस संस्करण है जो भार और मेरी 32 बिट DLL लपेटता, और एक अलग कार्यान्वयन कि भार और 64 बिट DLL लपेटता साथ, एक भी सार वर्ग तैयार करना है। IntPtr.Size के आधार पर उपयुक्त कार्यान्वयन को तुरंत चालू करने के लिए बेस क्लास में एक एकल फैक्ट्री विधि का उपयोग किया जा सकता है।

इस विधि की अच्छी बात है कि अपने कोड के बाकी पूरी तरह से मंच से अलग किया जाता है - यह सिर्फ एक वस्तु अपने आधार वर्ग कारखाने विधि का उपयोग कर निर्माण करती है, और इसके साथ काम करता है। प्रश्न में डीएलएल के भीतर कई तरीकों से कॉल करना भी बहुत आसान है, एक समान तरीके से, और आपके सभी "मूल" कोड को आसानी से निजी कार्यान्वयन में धकेल दिया जा सकता है।

14

आप SetDllDirectory एपीआई समारोह का लाभ ले सकता है, यह अप्रबंधित विधानसभाओं के लिए खोज पथ को बदल देता है। ऐप इंस्टॉल निर्देशिका की x86 उपनिर्देशिका में x32 उपनिर्देशिका में 64-बिट DLLs में अपने 32-बिट DLL को स्टोर करें।

भागो किसी भी पी/आह्वान एप्लिकेशन स्टार्टअप पर इससे पहले कि आप करते हैं इस कोड:

using System.IO; 
using System.Reflection; 
using System.Runtime.InteropServices; 
... 

    public static void SetUnmanagedDllDirectory() { 
     string path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     path = Path.Combine(path, IntPtr.Size == 8 ? "x64 " : "x86"); 
     if (!SetDllDirectory(path)) throw new System.ComponentModel.Win32Exception(); 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool SetDllDirectory(string path); 
+0

यह एक अच्छा समाधान है। – Kieron

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