एक DLL में क्या है और यह कैसे काम करता है?


86

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

मैं समझता हूं कि DLL एक गतिशील रूप से जुड़ा हुआ पुस्तकालय है जिसका अर्थ है कि "कार्यक्षमता" प्राप्त करने के लिए कोई अन्य प्रोग्राम इस लाइब्रेरी को समय पर एक्सेस कर सकता है। हालाँकि, निम्न ASP.NET प्रोजेक्ट के साथ विचार करें Web.dllऔर Business.dll( Web.dllयह फ्रंट एंड फ़ंक्शनलिटी है और यह Business.dllप्रकारों और विधियों के लिए संदर्भ है )।

  1. किस बिंदु पर Web.dllगतिशील रूप से लिंक होता है Business.dll? आप वर्ड (आदि) का उपयोग करते समय प्रतीत होता है कि छोटे कार्यों के लिए विंडोज एचडीडी थ्रेशिंग में बहुत अधिक ध्यान देते हैं और मुझे लगता है कि वर्ड बंद हो रहा है और गतिशील रूप से अन्य डीएलएल से कार्यक्षमता में लिंक हो रहा है?

    1 क। इसके अतिरिक्त, DLL - OS या कुछ रन टाइम फ्रेम जैसे .NET फ्रेमवर्क क्या लोड और लिंक करता है?

    1b। "लिंकिंग" की प्रक्रिया क्या है? क्या संगतता जांच की जाती है? एक ही मेमोरी में लोड हो रहा है? वास्तव में जोड़ने का क्या मतलब है?

  2. क्या वास्तव में DLL में कोड निष्पादित करता है? क्या यह प्रोसेसर द्वारा निष्पादित किया जाता है या क्या डीएलएल के अंदर कोड को समझने से पहले अनुवाद या संकलन का एक और चरण है?

    2 ए। C # .NET में निर्मित DLL के मामले में, यह क्या चल रहा है: .NET फ्रेमवर्क या सीधे ऑपरेटिंग सिस्टम?

  3. क्या लिनक्स से एक DLL विंडोज सिस्टम पर काम करता है (यदि ऐसा कुछ मौजूद है), या क्या वे ऑपरेटिंग सिस्टम विशिष्ट हैं?

  4. क्या DLL एक विशेष ढांचे के लिए विशिष्ट हैं? क्या C # .NET का उपयोग करके निर्मित DLL का उपयोग किसी DLL द्वारा किया जा सकता है, उदाहरण के लिए, Borland C ++?

    4 ए। यदि 4 का उत्तर "नहीं" है, तो DLL का क्या मतलब है? लिंक किए गए फ़ाइलों के लिए विभिन्न फ़्रेमवर्क अपने स्वयं के स्वरूपों का उपयोग क्यों नहीं करते हैं? उदाहरण के लिए: .NET में बनाया गया एक। Exe जानता है कि .abc का एक फ़ाइल प्रकार कुछ ऐसा है जिसे वह अपने कोड में लिंक कर सकता है।

  5. ग्राहक के एक वर्ग प्रकार को प्राप्त करने के लिए Web.dll/ Business.dllउदाहरण पर वापस जा रहा हूं - मुझे संदर्भ Business.dllदेने की आवश्यकता है Web.dll। इसका मतलब यह होना चाहिए कि वास्तव Business.dllमें ग्राहक वर्ग क्या है, इसके कुछ प्रकार शामिल हैं। यदि मैंने अपनी Business.dllफाइल को इसमें संकलित किया है, तो कहें: डेल्फी: क्या सी # इसे समझ पाएगा और ग्राहक वर्ग बनाने में सक्षम होगा, या क्या किसी प्रकार की हेडर जानकारी या ऐसा कुछ है जो कहता है कि "" क्षमा करें, आप केवल एक और डेल्फी डीएलएल से मेरा उपयोग कर सकते हैं। ?

    5 ए। विधियों के लिए भी लागू होता है; क्या मैं CreateInvoice()एक DLL में एक विधि लिख सकता हूं , इसे C ++ में संकलित कर सकता हूं , और फिर C # से इसे एक्सेस और रन कर सकता हूं ? मुझे ऐसा करने से क्या रोकता है या अनुमति देता है?

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

    6a। यदि मैं एक और DLL का उपयोग कर सकता हूं तो मेरा C # कार्यक्रम क्या तय कर रहा है? यदि मेरे अपहृत DLL में मूल के समान ही विधियाँ और प्रकार होते हैं लेकिन इसे किसी अन्य भाषा में संकलित किया गया है, तो क्या यह काम करेगा?

DLL आयात और DLL पंजीकरण क्या है?


21
यह प्रश्न काफी हद तक एसओ इतिहास में सबसे लंबा जवाब देने के लिए कह सकता है।
मैटी विर्ककुनेन

4
इसमें 12 अलग-अलग प्रश्न होने चाहिए थे।
हेंक होल्टरमैन

2
यह एक भयानक सवाल है, लेकिन मैं सच में @Chaos और @ माटी से सहमत हूं। इस प्रश्न पर अधिक ध्यान देने की आवश्यकता है और इसे कई अलग-अलग प्रश्नों में विभाजित किया जाना चाहिए।
क्रिस थॉम्पसन

3
यह एक मस्तिष्क डंप का एक सा था जब मैंने इसे लिखा था + मैं एक क्षेत्र में ज्ञान को केंद्रीकृत करना चाहता था :)
रेमोटेक

1
अब तक एक सामुदायिक विकि होना चाहिए।
लेप्पी जू

जवाबों:


74

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

1) किस बिंदु पर web.dll गतिशील रूप से business.dll से लिंक करती है? आप वर्ड आदि का उपयोग करते समय प्रतीत होने वाले छोटे कार्यों के लिए विंडोज एचडीडी थ्रशिंग में बहुत अधिक ध्यान देते हैं और मुझे लगता है कि यह शब्द बंद हो रहा है और गतिशील रूप से अन्य डीएलएल से कार्यक्षमता में लिंक कर रहा है?

1) .NET के मामले में, DLL को आमतौर पर मांग पर लोड किया जाता है जब DLL से कुछ भी एक्सेस करने की कोशिश करने वाली पहली विधि निष्पादित होती है। यही कारण है कि अगर आपके DLL को लोड नहीं किया जा सकता है तो आप अपने कोड में कहीं भी TypeNotFoundException प्राप्त कर सकते हैं। जब वर्ड जैसी कोई चीज अचानक एचडीडी को एक्सेस करना शुरू कर देती है, तो इसकी संभावना स्वैपिंग होती है (रैम में कमरा बनाने के लिए डिस्क पर स्वैप किया गया डेटा प्राप्त होता है)

1a) इसके अतिरिक्त क्या DLL - O / S या कुछ रनटाइम फ्रेमवर्क जैसे .Net फ्रेमवर्क को लोड और लिंक करता है?

1a) प्रबंधित DLL के मामले में, .NET फ्रेमवर्क वह है जो लोड करता है, JIT संकलन करता है (.NET कोड को नेटिव कोड में कंपाइल करता है) और DLL को लिंक करता है। मूल DLL के मामले में यह ऑपरेटिंग सिस्टम का एक घटक है जो DLL को लोड और लिंक करता है (कोई संकलन आवश्यक नहीं है क्योंकि मूल DLL में पहले से ही मूल कोड होता है)।

1 बी) "लिंकिंग" की प्रक्रिया क्या है? क्या जाँच की जाती है कि संगतता है? एक ही मेमोरी में लोड हो रहा है? वास्तव में जोड़ने का क्या मतलब है?

1 बी) लिंकिंग तब होता है जब DLL में प्रतीकों (जैसे तरीकों) के लिए कॉलिंग कोड में संदर्भ (जैसे विधि कॉल) को DLL में चीजों के वास्तविक पते से बदल दिया जाता है। यह आवश्यक है क्योंकि DLL में चीजों के अंतिम पते को मेमोरी में लोड होने से पहले नहीं जाना जा सकता है।

2) क्या वास्तव में DLL में कोड निष्पादित करता है? क्या यह प्रोसेसर द्वारा निष्पादित किया जाता है या क्या डीएलएल के अंदर कोड को समझने से पहले अनुवाद या संकलन का एक और चरण है?

2) विंडोज पर, .exe फाइलें और .dll फाइलें काफी समान हैं। मूल .exe और .dll फ़ाइलों में मूल कोड (प्रोसेसर द्वारा निष्पादित सामान) होता है, इसलिए अनुवाद करने की कोई आवश्यकता नहीं है। प्रबंधित .exe और .dll फ़ाइलों में .NET बाइटकोड होता है जो पहले JIT संकलित (देशी कोड में अनुवादित) है।

2a) C # .net से निर्मित DLL के मामले में यह क्या चल रहा है? सीधे .Net फ्रेमवर्क या ऑपरेटिंग सिस्टम?

2a) कोड को JIT संकलित किए जाने के बाद, यह किसी भी कोड की तरह सटीक रूप से चलाया जाता है।

3) क्या DLL का कहना है कि लिनक्स विंडोज सिस्टम पर काम करता है (अगर ऐसी कोई चीज मौजूद है) या क्या वे ऑपरेटिंग सिस्टम को विशिष्ट बनाते हैं?

3) प्रबंधित DLL के रूप में काम कर सकते हैं, जब तक दोनों प्लेटफार्मों पर रूपरेखा तारीख तक कर रहे हैं और जो कोई भी लिखा DLL जानबूझकर देशी कॉल का उपयोग करके संगतता को तोड़ने नहीं था। नेटिव DLL के रूप में काम नहीं करेगा, क्योंकि प्रारूप भिन्न हैं (भले ही अंदर मशीन कोड समान है, यदि वे दोनों एक ही प्रोसेसर प्लेटफॉर्म के लिए हैं)। वैसे, लिनक्स पर, "DLL" को .so (साझा ऑब्जेक्ट) फ़ाइलों के रूप में जाना जाता है।

4) क्या वे एक विशेष ढांचे के लिए विशिष्ट हैं? क्या C # .Net के उपयोग से निर्मित DLL का उपयोग Borland C ++ (केवल उदाहरण के साथ) द्वारा निर्मित DLL द्वारा किया जा सकता है?

4) प्रबंधित DLL विशेष रूप से .NET फ्रेमवर्क के लिए हैं, लेकिन स्वाभाविक रूप से वे किसी भी संगत भाषा के साथ काम करते हैं। मूल DLL तब तक संगत होते हैं जब तक कि सभी एक ही सम्मेलनों (कॉलिंग कन्वेंशन (मशीन कोड स्तर पर फ़ंक्शन तर्क कैसे पारित किए जाते हैं), प्रतीक नामकरण, आदि का उपयोग करते हैं)

5) वापस जा रहे हैं web.dll / business.dll उदाहरण के लिए। ग्राहक का एक वर्ग प्रकार प्राप्त करने के लिए मुझे web.dll से business.dll को संदर्भित करना होगा। इसका मतलब यह होना चाहिए कि business.dll में किसी प्रकार का एक विनिर्देश है जो वास्तव में ग्राहक वर्ग है। अगर मैं डेल्फी सी # में अपने business.dll फ़ाइल को संकलित किया था, तो इसे # समझ जाएगा और ग्राहक वर्ग बनाने में सक्षम होगा - या क्या किसी प्रकार की शीर्ष लेख जानकारी है या ऐसा कुछ है जो कहता है "अरे क्षमा करें आप केवल मुझे एक अन्य डेल्फी डीएल से उपयोग कर सकते हैं ।

5) प्रबंधित DLL में हर वर्ग, विधि, क्षेत्र आदि का पूरा विवरण होता है। AFAIK डेल्फी .NET का समर्थन नहीं करता है, इसलिए यह देशी DLL बनाएगा, जिसका उपयोग .NET में सीधे तौर पर नहीं किया जा सकता है। आप संभवतः PInvoke के साथ फ़ंक्शंस कॉल करने में सक्षम होंगे, लेकिन कक्षा की परिभाषाएं नहीं मिलेंगी। मैं डेल्फी का उपयोग नहीं करता, इसलिए मुझे नहीं पता कि यह DLL के साथ प्रकार की जानकारी कैसे संग्रहीत करता है। C ++, उदाहरण के लिए, हेडर (.h) फ़ाइलों पर निर्भर करता है जिसमें प्रकार की घोषणाएँ होती हैं और उन्हें DLL के साथ वितरित किया जाना चाहिए।

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

6) वास्तव में, यह करना मुश्किल नहीं है यदि आप आसानी से DLL स्विच कर सकते हैं। इससे बचने के लिए कोड साइनिंग का इस्तेमाल किया जा सकता है। किसी को हस्ताक्षरित डीएलएल को बदलने के लिए, उन्हें हस्ताक्षर कुंजी को जानना होगा, जिसे उसने गुप्त रखा था।

6a) यहाँ एक दोहराव वाला प्रश्न है, लेकिन यह मेरे C # कार्यक्रम में वापस आता है, यदि मैं एक और DLL का उपयोग कर सकता हूँ? अगर मेरे अपहृत DLL में मूल रूप में बिल्कुल समान विधियाँ और प्रकार होते हैं लेकिन इसे दूसरे लानुगेज में संकलित किया जाता है तो यह काम करेगा?

6a) यह तब तक काम करेगा जब तक कि यह एक प्रबंधित DLL है, जो किसी भी .NET भाषा के साथ बनाया गया है।

  • DLL क्या आयात कर रहा है और dll पंजीकरण?

"डीएलएल आयात" कई चीजों का मतलब हो सकता है, आमतौर पर इसका मतलब है कि डीएलएल फ़ाइल को संदर्भित करना और इसमें चीजों का उपयोग करना।

DLL पंजीकरण कुछ ऐसा है जो विंडोज पर विश्व स्तर पर DLL फ़ाइलों को COM घटकों के रूप में रजिस्टर करने के लिए किया जाता है ताकि उन्हें सिस्टम पर किसी भी सॉफ़्टवेयर के लिए उपलब्ध कराया जा सके।


3
मैं # 4 में जोड़ूंगा कि .NET DLL का अनुवाद कर सकता है ताकि वे COM (सामान्य ऑब्जेक्ट मॉडल) को समझने / उपयोग करने वाले किसी भी मूल कार्यक्रम के साथ संगत हों। बहुत अच्छे जवाब थो।
मेरीकोवा

7

.Dll फ़ाइल में संकलित कोड होता है जिसे आप अपने एप्लिकेशन में उपयोग कर सकते हैं।

कभी-कभी .dll मामलों को संकलित करने के लिए उपयोग किया जाने वाला उपकरण, कभी-कभी नहीं। यदि आप अपने प्रोजेक्ट में .dll को संदर्भित कर सकते हैं, तो यह महत्वपूर्ण नहीं है कि .dll के उजागर कार्यों को कोड करने के लिए किस टूल का उपयोग किया गया था।

लिंकिंग रनटाइम पर होती है, जो स्टैटिक-टाइम पर लिंक करती है, जैसे स्टैटिस्टिकल लाइब्रेरियों के विपरीत।

आप एक ब्लैक बॉक्स के रूप में एक .dll के बारे में सोच सकते हैं जो आपके आवेदन की ज़रूरतों को पूरा करता है जिसे आप खुद नहीं लिखना चाहते हैं। हां, .dll के हस्ताक्षर को समझने वाला कोई अन्य .dll फ़ाइल बना सकता है, जिसके अंदर विभिन्न कोड हों और आपके कॉलिंग एप्लिकेशन को अंतर पता न हो।

HTH


6

1) किस बिंदु पर web.dll गतिशील रूप से business.dll से लिंक करती है? आप वर्ड आदि का उपयोग करते समय प्रतीत होने वाले छोटे कार्यों के लिए विंडोज एचडीडी थ्रशिंग में बहुत अधिक ध्यान देते हैं और मुझे लगता है कि यह शब्द बंद हो रहा है और गतिशील रूप से अन्य डीएलएल से कार्यक्षमता में लिंक कर रहा है?

1) मुझे लगता है कि आप लोडिंग के साथ लिंक को भ्रमित कर रहे हैं। यह लिंक तब है जब सभी जाँचों और शेषियों का परीक्षण किया जाता है ताकि यह सुनिश्चित हो सके कि जो मांगा गया है वह उपलब्ध है। लोड समय पर, डीएल के कुछ हिस्सों को मेमोरी में लोड किया जाता है या पेजफाइल को स्वैप किया जाता है। यह HD गतिविधि है जिसे आप देख रहे हैं।

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

डायनामिक लिंकिंग को निहित किया जा सकता है (यानी आयात लिंक के साथ ऐप लिंक), या स्पष्ट (यानी ऐप डीएल लोड करने के लिए LoadLibrary (पूर्व) का उपयोग करता है)।

निहित मामले में, / DELAYLOAD का उपयोग dll की लोडिंग को स्थगित करने के लिए किया जा सकता है जब तक कि ऐप को वास्तव में इसकी आवश्यकता न हो। अन्यथा, कम से कम इसके कुछ हिस्सों को प्रक्रिया initilazation के हिस्से के रूप में लोड किया जाता है (प्रोसेस एड्रेस स्पेस में मैप किया जाता है)। Dll यह भी अनुरोध कर सकता है कि यह सक्रिय होने के दौरान कभी भी अनलोड न हो।

COM dll को लोड करने के लिए COM LoadLibrary का उपयोग करता है। ध्यान दें कि अंतर्निहित मामले में भी, सिस्टम लोड करने के लिए कुछ इसी तरह का उपयोग कर रहा है Dll को प्रक्रिया स्टार्टअप या पहले उपयोग पर लोड करने के लिए।

2) क्या वास्तव में DLL में कोड निष्पादित करता है? क्या यह प्रोसेसर द्वारा निष्पादित किया जाता है या क्या डीएलएल के अंदर कोड को समझने से पहले अनुवाद या संकलन का एक और चरण है?

2) Dll में .exes की तरह ऑब्जेक्ट कोड होते हैं। Dll फ़ाइल का प्रारूप एक exe फ़ाइल के प्रारूप के समान है। मैंने सुना है कि केवल एक बिट है जो दो फाइलों के हेडर में अलग है।

C # .net से निर्मित DLL के मामले में, .Net फ्रेमवर्क इसे चला रहा है।

3) क्या DLL का कहना है कि लिनक्स विंडोज सिस्टम पर काम करता है (अगर ऐसी कोई चीज मौजूद है) या क्या वे ऑपरेटिंग सिस्टम को विशिष्ट बनाते हैं?

3) DLL प्लेटफ़ॉर्म विशिष्ट हैं।

4) क्या वे एक विशेष ढांचे के लिए विशिष्ट हैं? क्या C # .Net के उपयोग से निर्मित DLL का उपयोग Borland C ++ (केवल उदाहरण के साथ) द्वारा निर्मित DLL द्वारा किया जा सकता है?

4) विशेष देखभाल की जाती है या कुछ अतिरिक्त गोंद कोड लिखा जाता है, तो Dlls अन्य रूपरेखाओं के साथ हस्तक्षेप कर सकते हैं।

Dll तब बहुत उपयोगी होते हैं जब कोई कंपनी कई उत्पाद बेचती है जिसमें ओवरलैपिंग क्षमता होती है। उदाहरण के लिए, मैं एक रास्टर i / o dll को बनाए रखता हूं जिसका उपयोग कंपनी में 30 से अधिक विभिन्न उत्पादों द्वारा किया जाता है। यदि आपके पास कई उत्पाद स्थापित हैं, तो dll का एक नवीनीकरण सभी उत्पादों को नए रेखापुंज स्वरूपों में अपग्रेड कर सकता है।

5) वापस जा रहे हैं web.dll / business.dll उदाहरण के लिए। ग्राहक का एक वर्ग प्रकार प्राप्त करने के लिए मुझे web.dll से business.dll को संदर्भित करना होगा। इसका मतलब यह होना चाहिए कि business.dll में किसी प्रकार का एक विनिर्देश है जो वास्तव में ग्राहक वर्ग है। अगर मैं डेल्फी सी # में अपने business.dll फ़ाइल को संकलित किया था, तो इसे # समझ जाएगा और ग्राहक वर्ग बनाने में सक्षम होगा - या क्या किसी प्रकार की शीर्ष लेख जानकारी है या ऐसा कुछ है जो कहता है "अरे क्षमा करें आप केवल मुझे एक अन्य डेल्फी डीएल से उपयोग कर सकते हैं ।

5) प्लेटफॉर्म पर निर्भर करते हुए, dll की क्षमताओं को विभिन्न तरीकों से प्रस्तुत किया जाता है, .h फाइलें, .tlb फाइलें, या .net पर अन्य तरीके।

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

6) डंपबिन / निर्यात और डंबिन / आयात, .exe और .dlls का उपयोग करने के लिए दिलचस्प उपकरण हैं


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