DLL फाइलें वास्तव में क्या हैं, और वे कैसे काम करती हैं?


224

DLL फाइलें वास्तव में कैसे काम करती हैं? लगता है उनमें से एक बहुत कुछ है, लेकिन मुझे नहीं पता कि वे क्या हैं या वे कैसे काम करते हैं।

तो, उनके साथ क्या सौदा है?


6
चूंकि यह केवल विंडोज के साथ टैग किया गया है, और यह सवाल 2008 में वापस लिखा गया था, यह उल्लेख के लायक है कि आजकल मैक और लिनक्स पर भी .NET कोर के साथ dll का रन होगा।
जिम अहो

जवाबों:


287

DLL क्या है?

डायनेमिक लिंक लाइब्रेरी (DLL) एस ईईएस की तरह हैं लेकिन वे सीधे निष्पादन योग्य नहीं हैं। वे लिनक्स / यूनिक्स में .so फ़ाइलों के समान हैं। यह कहना है, DLL साझा पुस्तकालयों के एमएस के कार्यान्वयन हैं।

DLL एक EXE की तरह ही होते हैं जो कि फाइल फॉर्मेट में ही होते हैं। EXE और DLL दोनों पोर्टेबल एक्जिक्यूटेबल (PE) फ़ाइल फॉर्मेट पर आधारित हैं। DLL में COM घटक और .NET लाइब्रेरी भी हो सकते हैं।

DLL में क्या होता है?

एक DLL में फ़ंक्शन, कक्षाएं, चर, UI और संसाधन (जैसे आइकन, चित्र, फ़ाइलें, ...) होते हैं, जो एक EXE, या अन्य DLL का उपयोग करता है।

पुस्तकालयों के प्रकार:

लगभग सभी ऑपरेटिंग सिस्टम पर, 2 प्रकार के पुस्तकालय हैं। स्थैतिक पुस्तकालय और गतिशील पुस्तकालय। खिड़कियों में फ़ाइल एक्सटेंशन इस प्रकार हैं: स्टेटिक लाइब्रेरी (.lib) और डायनेमिक लाइब्रेरी (.dll)। मुख्य अंतर यह है कि स्थिर पुस्तकालयों को संकलन के समय निष्पादन योग्य से जोड़ा जाता है; जबकि गतिशील लिंक्ड लाइब्रेरी रन-टाइम तक लिंक नहीं की जाती हैं।

स्थैतिक और गतिशील पुस्तकालयों पर अधिक:

यद्यपि आप अपने कंप्यूटर पर सामान्य रूप से स्थिर लाइब्रेरी नहीं देखते हैं, क्योंकि एक स्थिर लाइब्रेरी सीधे एक मॉड्यूल (EXE या DLL) के अंदर एम्बेडेड होती है। एक गतिशील पुस्तकालय एक स्टैंड-अलोन फ़ाइल है।

किसी DLL को किसी भी समय बदला जा सकता है और केवल रनटाइम पर लोड किया जाता है जब कोई EXE स्पष्ट रूप से DLL लोड करता है। EXE के भीतर संकलित होने के बाद एक स्थिर पुस्तकालय को नहीं बदला जा सकता है। EXE को अपडेट किए बिना एक DLL को व्यक्तिगत रूप से अपडेट किया जा सकता है।

एक DLL लोड हो रहा है:

एक प्रोग्राम स्टार्टअप पर एक DLL को Win32 API LoadLibrary के माध्यम से लोड करता है, या जब यह किसी अन्य DLL की निर्भरता है। किसी प्रोग्राम को लोड करने या किसी संसाधन को लोड करने के लिए LoadResource के लिए एक प्रोग्राम GetProcAddress का उपयोग करता है।

आगे की पढाई:

कृपया आगे पढ़ने के लिए MSDN या विकिपीडिया की जाँच करें । इस उत्तर के सूत्र भी।


5
शायद कहीं आयात आयात का उल्लेख करना चाहिए। ठीक है मैं अब चला जाऊंगा। :)
एडम मिट्ज

2
जो पता लगता है उन्हें हटा दिया। मुझे इसके लिए अंक कैसे प्राप्त होंगे? <g>
एडम मित्ज

36

DLL क्या है?

DLL फाइलें बाइनरी फाइलें होती हैं जिनमें एप्लिकेशन के विपरीत निष्पादन योग्य कोड और संसाधन शामिल हो सकते हैं, आदि अनुप्रयोगों के विपरीत, इन्हें सीधे निष्पादित नहीं किया जा सकता है, लेकिन एक एप्लिकेशन उन्हें आवश्यकता के रूप में और जब वे स्टार्टअप के दौरान (सभी एक बार में) लोड करेंगे।

क्या वे महत्वपूर्ण हैं?

अधिकांश एप्लिकेशन DLL की उन फ़ाइलों को लोड करेंगे जिनकी उन्हें स्टार्टअप में आवश्यकता है। यदि इनमें से कोई भी नहीं पाया जाता है तो सिस्टम बिल्कुल भी प्रक्रिया शुरू नहीं कर पाएगा।

DLL फ़ाइलों के लिए अन्य DLL फ़ाइलों की आवश्यकता हो सकती है

उसी तरह जिस एप्लिकेशन को एक DLL फ़ाइल की आवश्यकता होती है, एक DLL फाइल अन्य DLL फाइलों पर ही निर्भर हो सकती है। यदि निर्भरता की श्रृंखला में इन DLL फ़ाइलों में से एक नहीं मिली है, तो आवेदन लोड नहीं होगा। यह आसानी से किसी भी निर्भरता वॉकर उपकरण का उपयोग कर डिबग है, की तरह निर्भरता वाकर

सिस्टम फ़ोल्डर में उनमें से बहुत सारे हैं

अधिकांश सिस्टम कार्यक्षमता DLL फ़ाइलों के रूप में उपयोगकर्ता प्रोग्राम के संपर्क में है क्योंकि वे कोड / संसाधनों को साझा करने का एक मानक रूप हैं। प्रत्येक कार्यक्षमता को अलग-अलग DLL फ़ाइलों में अलग-अलग रखा जाता है, ताकि केवल आवश्यक DLL फ़ाइलों को लोड किया जा सके और इस प्रकार सिस्टम पर मेमोरी की कमी को कम किया जा सके।

इंस्टॉल किए गए एप्लिकेशन भी DLL फ़ाइलों का उपयोग करते हैं

DLL फाइलें ऊपर बताए अनुसार शारीरिक रूप से कार्यक्षमताओं को अलग करने का एक रूप भी बन जाती हैं। अच्छे अनुप्रयोग भी DLL फ़ाइलों को लोड करने की कोशिश नहीं करते हैं जब तक कि वे बिल्कुल आवश्यक न हों, जो मेमोरी आवश्यकताओं को कम कर देता है। यह बहुत सारे DLL फ़ाइलों के साथ एप्लिकेशन को शिप करने का कारण बनता है।

DLL नरक

हालाँकि, कई बार सिस्टम अपग्रेड अन्य कार्यक्रमों को तोड़ देता है जब साझा DLL फ़ाइलों और उनके लिए आवश्यक प्रोग्राम के बीच एक संस्करण बेमेल होता है। इस समस्या को हल करने के लिए सिस्टम चौकियों और डीएलएल कैश आदि एम $ से पहल की गई है। .NET प्लेटफ़ॉर्म इस समस्या का सामना नहीं कर सकता है।

हम कैसे जानते हैं कि DLL फाइल के अंदर क्या है?

आपको DUMPBIN या डिपेंडेंसी वॉकर जैसे बाहरी उपकरण का उपयोग करना होगा जो न केवल सार्वजनिक रूप से दिखाई देने वाले कार्यों (निर्यात के रूप में जाना जाता है) को DLL फ़ाइलों के अंदर समाहित करता है और यह भी बताता है कि अन्य DLL फ़ाइलों की क्या आवश्यकता है और जो DLL फाइल उन DLL फ़ाइलों से निर्यात करता है पर निर्भर है।

हम उन्हें कैसे बनाते / उपयोग करते हैं?

अपने विक्रेता से प्रोग्रामिंग प्रलेखन देखें। C ++ के लिए, MSDN में LoadLibrary का संदर्भ लें ।


2
कृपया इस वाक्य को ( "The .NET platform might not face this issue at all."क्यों) पूरा करें । धन्यवाद।
जोगी

1
@RehanKhan .NET फ्रेमवर्क v2.0 के साथ शुरू, रनटाइम केवल एक .NET संस्करण के साथ संकलित असेंबलियों को लोड करेगा <= वर्तमान में लोड किया गया रनटाइम। .NET असेंबली को लोड करने के प्रयासों को भी विफल कर देता है + अगर पहले से ही एक असेंबली में स्थित कॉल, सीएल टाइमटाइम रन करता है पहले से लोड किए गए असेंबली का उपयोग करेगा। सब के सब, मुझे लगता है कि यह कहना बेहतर होगा कि DLLs के प्रोग्राम के रनटाइम को लोड करने से पहले बहुत भारी प्रतिबंध लागू करने से उन्होंने समस्या को हल कर लिया (इससे पहले कि यह बस छोड़ देता है और आपकी मदद मांगता है)।
व्लादिस्लाव मार्टिन

14

मान लें कि आप एक निष्पादन योग्य बना रहे हैं जो एक पुस्तकालय में पाए जाने वाले कुछ कार्यों का उपयोग करता है।

यदि आप जिस लाइब्रेरी का उपयोग कर रहे हैं वह स्थिर है , तो लिंकर इन कार्यों के लिए ऑब्जेक्ट कोड को सीधे लाइब्रेरी से कॉपी करेगा और उन्हें निष्पादन योग्य में सम्मिलित करेगा।

अब अगर यह निष्पादन योग्य है, तो इसमें वह हर चीज है, जिसकी आवश्यकता है, इसलिए निष्पादन योग्य लोडर इसे केवल मेमोरी में लोड करता है और इसे चलाता है।

यदि लाइब्रेरी गतिशील है तो लिंकर ऑब्जेक्ट कोड नहीं डालेगा, बल्कि यह एक स्टब डालेगा, जो मूल रूप से कहता है कि यह फ़ंक्शन इस स्थान पर DLL में स्थित है ।

अब यदि यह निष्पादन योग्य चलाया जाता है, तो निष्पादन योग्य बिट्स गायब हो जाते हैं (यानी स्टब्स) इसलिए लोडर निष्पादन योग्य फिक्सिंग के माध्यम से लापता स्टब्स को ऊपर ले जाता है। सभी स्टब्स के निराकरण के बाद ही निष्पादन योग्य को चलाने की अनुमति दी जाएगी।

इसे हटाने के लिए डीएलएल को हटा दें या नाम बदलें और देखें कि लोडर लापता DLL त्रुटि की रिपोर्ट कैसे करेगा जब आप निष्पादन योग्य को चलाने का प्रयास करेंगे।

इसलिए नाम डायनेमिक लिंक लाइब्रेरी , निष्पादन योग्य लोडर द्वारा लिंकिंग प्रक्रिया के कुछ हिस्सों को गतिशील रूप से चलाया जा रहा है।

एक अंतिम नोट, यदि आप DLL से लिंक नहीं करते हैं, तो लिंकर द्वारा कोई स्टब्स नहीं डाला जाएगा, लेकिन विंडोज अभी भी GetProcAddress API प्रदान करता है जो आपको निष्पादन योग्य समय शुरू होने के लंबे समय बाद DLL फ़ंक्शन प्रविष्टि बिंदु को लोड करने की अनुमति देता है।


12

DLL (डायनेमिक लिंक लाइब्रेरी) और SLs (साझा लाइब्रेरी, UNIX के तहत समतुल्य) निष्पादन योग्य कोड की लाइब्रेरी हैं, जिन्हें लोड समय में गतिशील रूप से निष्पादन योग्य में जोड़ा जा सकता है।

स्टेटिक लाइब्रेरी संकलित समय पर एक निष्पादन योग्य में डाली जाती हैं और उस बिंदु से तय की जाती हैं। वे निष्पादन योग्य का आकार बढ़ाते हैं और साझा नहीं किए जा सकते।

डायनामिक लाइब्रेरी के निम्नलिखित फायदे हैं:

1 / वे संकलित समय के बजाय रन टाइम पर लोड किए जाते हैं ताकि उन्हें स्वतंत्र रूप से निष्पादन योग्य के रूप में अपडेट किया जा सके (उन सभी फैंसी विंडोज़ और डायलॉग बॉक्स जो आप विंडोज में देखते हैं DLL से आते हैं ताकि आपके एप्लिकेशन का लुक-एंड-फील आपके बिना बदल सके। इसे फिर से लिखना)।

2 / क्योंकि वे स्वतंत्र हैं, कोड को कई निष्पादन योग्य में साझा किया जा सकता है - यह तब से मेमोरी को बचाता है, यदि आप एक ही DLL के साथ 100 ऐप चला रहे हैं, तो मेमोरी में केवल DLL की एक प्रति हो सकती है।

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


11

DLL फ़ाइलों में एक निर्यात तालिका होती है जो प्रतीकों की एक सूची होती है जिसे कॉलिंग प्रोग्राम द्वारा देखा जा सकता है। प्रतीक आमतौर पर सी कॉलिंग कन्वेंशन ( __stcall ) के साथ कार्य करते हैं । एक्सपोर्ट टेबल में फ़ंक्शन का पता भी होता है।

इस जानकारी के साथ, कॉलिंग प्रोग्राम तब DLL के भीतर फ़ंक्शन को कॉल कर सकता है, भले ही इसका संकलन समय पर DLL तक पहुंच न हो।

डायनेमिक लिंक लाइब्रेरी का परिचय कुछ और जानकारी है।


6

http://support.microsoft.com/kb/815065

डीएलएल एक पुस्तकालय है जिसमें कोड और डेटा होते हैं जिनका उपयोग एक ही समय में एक से अधिक कार्यक्रमों द्वारा किया जा सकता है। उदाहरण के लिए, विंडोज ऑपरेटिंग सिस्टम में, Comdlg32 DLL आम संवाद बॉक्स से संबंधित कार्य करता है। इसलिए, प्रत्येक प्रोग्राम ओपन DL बॉक्स को लागू करने के लिए इस DLL में निहित कार्यक्षमता का उपयोग कर सकता है। यह कोड पुन: उपयोग और कुशल मेमोरी उपयोग को बढ़ावा देने में मदद करता है।

DLL का उपयोग करके, एक प्रोग्राम को अलग-अलग घटकों में संशोधित किया जा सकता है। उदाहरण के लिए, एक लेखा कार्यक्रम मॉड्यूल द्वारा बेचा जा सकता है। प्रत्येक मॉड्यूल को रन टाइम पर मुख्य कार्यक्रम में लोड किया जा सकता है यदि उस मॉड्यूल को स्थापित किया गया हो। क्योंकि मॉड्यूल अलग हैं, प्रोग्राम का लोड समय तेज है, और एक मॉड्यूल केवल तब लोड होता है जब उस कार्यक्षमता का अनुरोध किया जाता है।

इसके अतिरिक्त, अद्यतन कार्यक्रम के अन्य भागों को प्रभावित किए बिना प्रत्येक मॉड्यूल पर लागू करना आसान है। उदाहरण के लिए, आपके पास पेरोल कार्यक्रम हो सकता है, और प्रत्येक वर्ष कर की दरों में परिवर्तन होता है। जब ये परिवर्तन एक DLL से अलग हो जाते हैं, तो आप पूरे प्रोग्राम को फिर से बनाने या स्थापित करने की आवश्यकता के बिना एक अपडेट लागू कर सकते हैं।

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLL एक फाइल एक्सटेंशन है और विंडोज प्रोग्राम्स के लिए कई कोड और प्रक्रियाओं को रखने के लिए "डायनेमिक लिंक लाइब्रेरी" फाइल फॉर्मेट के रूप में जाना जाता है। सॉफ्टवेयर और गेम्स डीएलएल फाइलों के ठिकानों पर चलते हैं; DLL फाइलें बनाई गई थीं ताकि एक ही समय में कई एप्लिकेशन अपनी जानकारी का उपयोग कर सकें।

यदि आप DLL फ़ाइलों के बारे में अधिक जानकारी प्राप्त करना चाहते हैं या किसी भी त्रुटि का सामना कर रहे हैं तो निम्न पोस्ट पढ़ें। https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

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


3
वे वास्तव में एक यूआई स्टोर कर सकते हैं और कई कार्यक्रम ऐसा करते हैं। उदाहरण के लिए स्नैप-इन।
ब्रायन आर। बॉडी

1

माइक्रोसॉफ्ट के अनुसार

(DLL) डायनामिक लिंक लाइब्रेरी वे फाइलें होती हैं जिनमें एप्लिकेशन चलाने के लिए आवश्यक डेटा, कोड या संसाधन होते हैं। ये ऐसी फाइलें हैं जो विंडोज़ पारिस्थितिकी तंत्र द्वारा बनाई गई हैं और इन्हें दो या अधिक अनुप्रयोगों के बीच साझा किया जा सकता है।

जब कोई प्रोग्राम या सॉफ्टवेयर विंडोज पर चलता है, तो एप्लिकेशन का कितना काम प्रोग्राम के DLL फाइलों पर निर्भर करता है। उदाहरण के लिए, यदि किसी विशेष एप्लिकेशन में कई मॉड्यूल होते हैं, तो प्रत्येक मॉड्यूल एक दूसरे के साथ कैसे संवाद करते हैं, यह विंडोज डीएलएल फाइलों द्वारा निर्धारित किया जाता है।

यदि आप विस्तृत विवरण चाहते हैं, तो इन उपयोगी संसाधनों की जाँच करें

Dll फाइलें क्या हैं , Dll फाइलों के बारे में

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.