2010-09-02 26 views
69

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

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

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

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

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

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

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

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

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

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

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

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

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

    6 ए। मेरे सी # प्रोग्राम में क्या निर्णय ले रहा है कि क्या मैं एक और डीएलएल एक्सेस कर सकता हूं?अगर मेरे अपहृत डीएलएल में मूल रूप से वही विधियों और प्रकार शामिल थे लेकिन इसे किसी अन्य भाषा में संकलित किया गया था, तो क्या यह काम करेगा?

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

+15

यह प्रश्न शायद SO इतिहास में सबसे लंबे उत्तर के लिए पूछ रहा है। –

+0

मुझे लगता है कि इस प्रश्न को अधिक ध्यान देने की जरूरत है। मैं बंद करने के लिए वोट नहीं दूंगा क्योंकि मुझे लगता है कि इसकी क्षमता है। – ChaosPandion

+3

यह 12 अलग-अलग प्रश्न हो सकते थे। –

उत्तर

56

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

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

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

1 क) इसके अतिरिक्त क्या भार और DLL लिंक गमागमन है - ओ/एस या कुछ रनटाइम फ्रेमवर्क जैसे नेट फ्रेमवर्क?

1 क) में कामयाब रहे DLLs के मामले में, नेट ढांचा क्या भार, JIT compiles (मूल कोड में नेट बाईटकोड संकलित) और DLLs लिंक होता है। देशी डीएलएल के मामले में यह ऑपरेटिंग सिस्टम का एक घटक है जो डीएलएल लोड करता है और लिंक करता है (कोई संकलन आवश्यक नहीं है क्योंकि देशी डीएलएल में पहले से ही देशी कोड होता है)।

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

1b) लिंकिंग तब होती है जब डीएलएल में कॉलिंग कोड (उदा। विधियों) को संदर्भ कोड (उदा। विधि) में संदर्भ (डीएलएल) में चीजों के वास्तविक पते के साथ प्रतिस्थापित किया जाता है। यह जरूरी है क्योंकि डीएलएल में चीजों के अंतिम पते को स्मृति में लोड होने से पहले ज्ञात नहीं किया जा सकता है।

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

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

2 ए) सी # नेट से निर्मित डीएलएल के मामले में यह क्या चल रहा है? नेट फ्रेमवर्क या ऑपरेटिंग सिस्टम सीधे?

2 ए) कोड जेआईटी संकलित होने के बाद, यह किसी भी कोड के समान तरीके से चलाया गया है।

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

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

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

4) प्रबंधित डीएलएल .NET ढांचे के लिए विशेष हैं, लेकिन स्वाभाविक रूप से वे किसी भी संगत भाषा के साथ काम करते हैं। मूल निवासी DLLs तक संगत के रूप में हर किसी को एक ही सम्मेलनों का उपयोग करता

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

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

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

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

6a) एक दोहराने सवाल यहाँ के बारे में थोड़ी लेकिन यह मेरा सी # कार्यक्रम में क्या करने के लिए वापस चला जाता है यह तय करना है? अगर मेरा अपहरण किया गया DLL मूल रूप से वही विधियों और प्रकारों को निहित करता है लेकिन किसी अन्य लंगेज में संकलित किया गया था तो यह काम करेगा?

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

  • डीएलएल आयात क्या है? और डीएल पंजीकरण?

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

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

+1

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

5

ए। डीएल फाइल में संकलित कोड है जो आप अपने आवेदन में उपयोग कर सकते हैं।

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

लिंकिंग रनटाइम पर होता है, स्थिर रूप से जुड़े पुस्तकालयों के विपरीत, जैसे आपकी कक्षाएं, जो संकलन-समय पर लिंक करती हैं।

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

HTH

5

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

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

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

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

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

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

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

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

सी # नेट से निर्मित डीएलएल के मामले में, नेट फ्रेमवर्क इसे चला रहा है।

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

3) डीएलएल प्लेटफार्म विशिष्ट हैं।

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

4) डीएलएस अन्य ढांचे के साथ अंतःक्रिया कर सकते हैं यदि विशेष देखभाल की जाती है या कुछ अतिरिक्त गोंद कोड लिखा जाता है।

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

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

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

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

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

+0

3) डीएलएल _platform_ विशिष्ट हैं –

-1

DLL फ़ाइल हमारे स्रोत कोड के उत्पादन में संकलित किया गया है।वीएस या किसी अन्य उपकरण में हम जो लिखते हैं उसे स्रोत कोड के रूप में जाना जाएगा। लिखने के बाद इसे आवश्यक कार्यों को करने के लिए कंप्यूटर द्वारा समझा जाना चाहिए। ताकि हम बिल्ड ऑपरेशन कर सकें जहां कोड मशीन स्तर भाषाओं में परिवर्तित हो जाएगा।
तो बिल्ड-एडी फ़ाइल को डीएलएल फ़ाइल के रूप में जाना जाता है।

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