2010-03-09 13 views
10

मेरे पास एक मौजूदा ऐप है जो एक ही निर्देशिका में एक डीएलएल में रहता है जो ऐप के रूप में उसी निर्देशिका में रहता है।पी/गतिशील डीएलएल खोज पथ

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

इसलिए मेरा प्रश्न: डीएलआईपोर्ट घोषणा में दिए गए डीएलएल की निर्देशिका को नियंत्रित करने के लिए मुझे किन विकल्पों को नियंत्रित करना है?

मुझे लगता है मैं इन दो विचारों के किसी भी कोशिश कर रहा द्वारा शुरू कर सकते हैं:

1) पहली पी/आह्वान करने से पहले मेरी वांछित निर्देशिका स्थापित करने के लिए और फिर इसे बाद में रीसेट "SetDllDirectory" का प्रयोग करें।

2) वांछित DLL को "LoadLibraryEx" का उपयोग करके मैन्युअल रूप से लोड करें और उम्मीद करें कि यह चाल करेगा।

लेकिन क्या पहले प्रयास करने के लिए कोई और ".NET: ish way" है?

अद्यतन: मुझे एहसास है कि मैं डीएलएल को दो अलग-अलग नेट असेंबली में एक्सेस कर सकता हूं और फिर उनमें से प्रत्येक को संबंधित एपीआई फाइलों के साथ एक अलग निर्देशिका में रख सकता हूं। फिर मैं उचित .NET असेंबली को गतिशील रूप से लोड कर सकता हूं और सही डीएलएल की लोडिंग स्वचालित रूप से हो सकती है। कोई कारण नहीं है जो काम नहीं करना चाहिए?

मैं एक के बारे में सोच सकता हूं: मैं इस सामान को डिबग करने के बारे में कैसे जाउंगा? विजुअल स्टूडियो को यह बताना संभव है कि एक असेंबली (मेरे समाधान में निहित) को उपनिर्देशिका में रखा जाएगा और वहां से डीबग किया जाएगा?

उत्तर

9

मेरे संवेदना में पूरा पथ निर्दिष्ट कर सकते हैं (और रिश्तेदार हो सकता है), मैं एपीआई में से एक को देखा है और यह वास्तव में आश्चर्यजनक बुरा था। बड़ी समस्या यह है कि आपको डीएलएल खोजने के लिए विंडोज़ को मनाने में सक्षम होना चाहिए। वे आपकी .exe निर्देशिका में नहीं होंगे, इसलिए डिफ़ॉल्ट काम नहीं करेगा। SetDllDirectory() का उपयोग करना, पर्यावरण का उपयोग करेगा। CurrentDirectory भी करता है। लोड लाइब्रेरी काम नहीं कर सकती है, पी/Invoc marshaller लोडLibrary का उपयोग करेगा।

यदि यह एक विकल्प है, तो आप DllImport() कन्स्ट्रक्टर के लिए अलग-अलग तर्कों का उपयोग करके और EntryPoint विशेषता का उपयोग करके दो पी/आमंत्रण घोषणाओं के लिए अलग-अलग नामों का उपयोग कर सकते हैं। ऐसा नहीं लगता है कि उड़ जाएगा।

+1

इस पल के लिए, मैं आपको अपनी संवेदनाओं के लिए एक +1 दे रहा हूं, मुझे वास्तव में इसकी आवश्यकता है, पिछले छह वर्षों में आपदा के साथ कई बार अपने एपीआई के संपर्क में आने के बाद ... –

1

आपका पहला विकल्प (पी/सेटडेल डायरेक्टरी के साथ आमंत्रित) वह विकल्प है जिसे मैं व्यक्तिगत रूप से पसंद करता हूं। दुर्भाग्यवश, देशी डीएलएल लोड करने को संभालने के लिए ".NETish" तरीका नहीं है ... जो समझ में आता है।

2

मुझे लगता है कि दूसरा विकल्प काम करेगा, लेकिन इसे .NET में dll लोडिंग को प्रबंधित करने के लिए बहुत सी कोड लिखनी होगी।

पहला व्यक्ति भी काम कर सकता है, लेकिन मुझे या तो यह पसंद नहीं है।

यहाँ मेरी सुझाव है: आप DllImport [DllImport(@"C:\dll\a32.dll"]

+0

समस्या यह है कि DLL निर्देशिका चल रही है, डीएलएल की लोडिंग स्वयं नहीं, मुझे लगता है। – Tanzelax

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