यह मुख्य रूप से एक तैनाती समस्या है, बस अपने इंस्टॉलर को लक्ष्य मशीन पर विंडोज संस्करण के आधार पर सही DLL कॉपी करें।
लेकिन कोई भी ऐसा कभी नहीं करना पसंद करता है। सही DLL के फ़ंक्शन को गतिशील रूप से पिनवोक करना बेहद दर्दनाक है, आपको प्रत्येक निर्यात किए गए फ़ंक्शन के लिए प्रतिनिधि प्रकार लिखना होगा और प्रतिनिधि ऑब्जेक्ट बनाने के लिए लोड लाइब्रेरी + GetProcAddress + Marshal.GetDelegateForFunctionPointer का उपयोग करना होगा।
लेकिन कोई भी ऐसा कभी नहीं करना पसंद करता है। कम दर्दनाक प्रयास दो बार फ़ंक्शन घोषित करना है, इसे अलग-अलग नाम देना और वास्तविक नाम निर्दिष्ट करने के लिए [DllImport] विशेषता में EntryPoint प्रॉपर्टी का उपयोग करना है। फिर उस रनटाइम पर परीक्षण करें जिसे आप कॉल करना चाहते हैं।
लेकिन कोई भी ऐसा कभी नहीं करना पसंद करता है। सबसे प्रभावी चाल आपके लिए सही डीएलएल लोड करने में विंडोज़ को चलाती है। सबसे पहले आपको जो करना है वह डीएलएल को उस निर्देशिका में कॉपी करें जहां विंडोज इसकी तलाश नहीं करेगा। सबसे अच्छा तरीका है अपनी बिल्ड निर्देशिका में "x86" और "x64" उपनिर्देशिका बनाना और उचित DLL को प्रत्येक में कॉपी करना है। ऐसा पोस्ट-बिल्ड ईवेंट लिखकर ऐसा करें जो निर्देशिका बनाता है और DLL को प्रतिलिपि बनाता है।
फिर इसके बारे में विंडोज़ को SetDllDirectory() को पिनवोक करके बताएं। आपके द्वारा निर्दिष्ट पथ निर्देशिकाओं में जोड़ा जाएगा जो विंडोज एक डीएलएल की खोज करता है। इस तरह:
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
class Program {
static void Main(string[] args) {
var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
//etc..
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetDllDirectory(string path);
}
मान लें कि 64-बिट मोड में कोड चलाने के लिए वास्तव में आपके लिए उपयोगी है या नहीं। आपके द्वारा प्राप्त होने वाली विशाल वर्चुअल मेमोरी एड्रेस स्पेस की आवश्यकता के लिए यह बहुत दुर्लभ है, केवल वास्तविक लाभ। आपको अभी भी 32-बिट संस्करण का समर्थन करने की आवश्यकता है जिसे 2 गीगाबाइट मामले में सही ढंग से संचालित करने की आवश्यकता है।
स्रोत
2012-08-13 14:13:45
दोनों संस्करणों (निजी विधियों) को आयात करने के बारे में क्या है लेकिन क्लाइंट कोड को पर्यावरण के आधार पर सही तरीके से बेनकाब करने के लिए? .NET 4 के साथ बस [Environment.Is64BitOperatingSystem] (http://msdn.microsoft) की जांच करें।com/en-us/पुस्तकालय/system.environment.is64bitoperatingsystem.aspx)। नोट मैं निर्भर देशी डीएलएल की वजह से सी # अनुप्रयोग के दो अलग-अलग संस्करण नहीं रखूंगा (इसलिए मैं इसके लिए प्रीप्रोसेसर का उपयोग नहीं करता)। –
माइकल - यह लगभग मेरा प्रश्न है, लेकिन मेरे पास एक अतिरिक्त जटिलता है जिसका अर्थ है कि उनका समाधान काम नहीं करेगा। मेरा डीएल एक परियोजना द्वारा आयात किया जाता है जो कि एसीसीपीयू है, और एक मूल परियोजना यह तय करती है कि एप्लिकेशन x64 या x86 – Sugrue
@ सुग्रे है तो आपको रनटाइम समाधान का उपयोग करने की आवश्यकता होगी, अर्थात् दोनों को आयात करें और 'पर्यावरण। आईएस 64 बिटप्रोसेस' या 'आकार' का उपयोग करें (शून्य *) ', या' IntPtr.Size'। –