आप यह निर्दिष्ट नहीं करते हैं कि आपका पर्यावरण .NET या सीधे Win32 है या नहीं।
मैं अपने Win32 को मान रहा हूं क्योंकि यदि इसकी .NET प्रौद्योगिकियां ग्लोबल असेंबली कैश जैसी चीजों के मामले में हाथ के करीब हैं।
Win32 के संदर्भ में यह दो तरीकों में से एक में एक साझा किए गए स्थान से DLLs लोड करने के लिए संभव है:
उपयोग स्पष्ट पूर्ण पथ के साथ LoadLibrary। इसका मतलब है कि आप स्थिर लिंकिंग का उपयोग नहीं कर सकते - सभी उत्पादों में उपयोग किए जाने वाले सभी डीएलएल कार्यों को GetProcAddress के माध्यम से एक्सेस करना होगा। आप लोड लाइब्रेरी के माध्यम से लोड किए गए डीएलएल से सी ++ कक्षाएं आयात नहीं कर सकते हैं - उन्हें स्थिर रूप से काम से जोड़ा जाना चाहिए ताकि यह दृष्टिकोण व्यवहार्य हो या न हो। शिम हेडर फाइलों को लिखना बहुत कठिन नहीं है जो डीएल के इंटरफेस के रूप में मास्कराइड करते हैं और प्रत्येक कॉल के लिए जरूरी समय में डीएलएल लोड और GetProcAddress करते हैं।
दूसरा विकल्प डीएल को "साइड बाय साइड असेंबली" कहलाता है और उन्हें WinSxS स्टोर में इंस्टॉल करना है। बड़े नाम से डरो मत। "साइड बाय साइड असेंबली" का अर्थ है "संस्करण जानकारी के साथ एक डीएल फाइल प्लस मेनिफेस्ट फ़ाइल"। विभिन्न अनुप्रयोगों में से प्रत्येक को 'मजबूत नाम' रखा जाएगा - जिसमें संस्करण जानकारी शामिल है - प्रत्येक एप्लिकेशन के उपयोग के लिए अपने एप्लिकेशन मेनिफेस्ट में, और Win32 Dll लोडर WinSxS स्टोर से सामान्य डीएल के सही उदाहरण को चुनने के लिए इसका उपयोग करेगा । बुनियादी प्रक्रिया MSDN आलेख में वर्णित किया गया है Guidelines for Creating Side-by-side Assemblies
Windows संस्करण 6.1 और ऊपर पर (विंडोज सर्वर 2008 और विडंबना यह है कि नामित विंडोज 7) आवेदन विन्यास फाइल अब Application Configuration Files
में जांच तत्व का समर्थन करते हैं
इसका मतलब है कि आप एक डीएलएल असेंबली युक्त फ़ोल्डर में एक पथ (आपके आवेदन के सापेक्ष) प्रदान करने में सक्षम होना चाहिए, जिसे आप लोड करना चाहते हैं।
ठीक है, Ive विंडोज 7 पर कुछ परीक्षण किया है, और यह काम करता है:
मान लें कि आप एक आवेदन app1.exe \ Program Files \ APP1 में स्थापित है, कि कुछ सामान्य dll "thedll पर निर्भर करता है है। dll "
आवेदन फ़ोल्डर में (\ Program Files \ APP1) एक फ़ाइल App1.exe.config बनाने और इसे निम्नलिखित सामग्री दे: -
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="..\AcmeCommon"/>
</assemblyBinding>
</windows>
</configuration>
अब, एक फ़ोल्डर \ Program एफ बनाएं जिसका नाम Iles \ AcmeCommon, और उस में एक फ़ोल्डर acme.thedll, और \ Program Files में thedll.dll कॉपी \ AcmeCommon \ acme.thedll
इसके अलावा acme.thedll.manifest बुलाया AcmeCommon \ acme.thedll में एक फ़ाइल बनाने - यह विधानसभा प्रकट 'acme.thedll' नामक विधानसभा का वर्णन किया जाएगा
acme.thedll.manifest की सामग्री हो जाएगा: -
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" type="win32"/>
<file name="thedll.dll"/>
</assembly>
अब हम आम dll, एक आम स्थान में, राशि के रूप में एक देशी एसएक्स असेंबली। हमारे पास ऐप है, एक कॉन्फ़िगरेशन फ़ाइल के साथ जो विंडोज 7 और 2008 सर्वर (और ऊपर) पर सामान्य स्थान पर असेंबली खोजने के लिए कहेंगे। लेकिन ऐप अभी भी एक असेंबली के बजाय डीएल के रूप में एक डीएल के रूप में जोड़ने की कोशिश कर रहा है।
ऐप को असेंबली लोड करने के लिए, हमें एप्लिकेशन में एक मेनिफेस्ट फ़ाइल जोड़ने की आवश्यकता है। यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं, तो आपके एप्लिकेशन शायद लिंकर और मैनिफेस्ट टूल प्रोजेक्ट सेटिंग्स के माध्यम से मैनिफ़ेस्ट बनाने और एम्बेड करने के लिए पहले ही कॉन्फ़िगर किए गए हैं।
#pragma comment(linker,"/manifestdependency:\"type='win32' name='acme.thedll' version='1.2.3.4' processorArchitecture='x86' language='*'\"")
यदि आप किसी पुराने उपयोग कर रहे हैं: - जो मामले में सबसे आसान तरीका विधानसभा परियोजना में कम से कम एक शीर्ष लेख या ग/सीपीपी फ़ाइल में निम्न कोड जोड़ने के बाद यह पुनर्निर्माण के लिए है के बारे में बताने के लिए एप्लिकेशन
<dependency>
<dependentassembly>
<assemblyidentity type="win32" name="acme.thedll" version="1.2.3.4" processorArchitecture="x86" language="*"/>
</dependentassembly>
</dependency>
इस चक्र बंद हो जाना चाहिए: वातावरण जहां प्रकट हाथ बना रहे हैं आप APP1 फ़ोल्डर में app1.exe.manifest साथ निम्नलिखित एक्सएमएल मर्ज करने के लिए की आवश्यकता होगी निर्माण एप्लिकेशन Win32 लोडर लोड होगा लोड करता है एप्लिकेशन मैनिफेस्ट (app1.exe.manifest या RT_MANIFEST संसाधन के रूप में एम्बेड किया गया) और "acme.thedll" असेंबली के बारे में जानें। यह एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल (app1.exe.config) भी लोड करेगा और असेंबली खोजने के लिए निजी पथ के बारे में जानेंगे। और फिर यह "सक्रियण संदर्भ" ऐप्स को "acme.thedll.manifest" लोड और जोड़ देगा। फिर, जब लोडर "thedll.dll" लोड करने का प्रयास करता है तो यह सक्रियण संदर्भ डीबी को खोजेगा, यह पता लगाएं कि यह acme.thedll असेंबली में है, और इसे असेंबली स्थान से लोड करें।
आपके उत्तर के लिए धन्यवाद। दुर्भाग्य से मैं सी/सी ++ एप्लिकेशन की तलाश में हूं जो उदाहरण के लिए किसी भी रन टाइम डायनामिक लिंकिंग विधि (जैसे लोडलब्रिरी (..)) का उपयोग नहीं करता है। क्या वैसे भी प्रकट होता है जैसे कि 'जांच' अवधारणा कैसे काम करती है? – Kartlee
@ कार्टली, क्षमा करें मुझे सी/सी ++ के बारे में पता नहीं है; लेकिन मैंने आपके प्रश्न को संपादित करने के लिए संपादित किया कि कीवर्ड –