मैं dll और exe फ़ाइल के बीच सटीक अंतर जानना चाहता हूं।
मैं dll और exe फ़ाइल के बीच सटीक अंतर जानना चाहता हूं।
जवाबों:
प्रोग्राम फ़ाइल:
DLL:
अधिक जानकारी के लिए: http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_exEan
संदर्भ: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exexx
LibMain
फ़ंक्शन के माध्यम से थ्रेड प्रारंभ या बंद होने पर, हर DLL एक प्रक्रिया प्राप्त कर सकता है ।
मैं नहीं जानता कि क्यों हर कोई .NET के संदर्भ में इस सवाल का जवाब दे रहा है। सवाल एक सामान्य था और कहीं भी .NET का उल्लेख नहीं किया था।
खैर, प्रमुख अंतर हैं:
प्रोग्राम फ़ाइल
DLL
DLL और exe का फ़ाइल प्रारूप अनिवार्य रूप से समान है। Windows फ़ाइल में PE हैडर के माध्यम से DLL और EXE के बीच के अंतर को पहचानता है। पीई हैडर के विवरण के लिए, आप MSDN पर इस लेख पर एक नज़र डाल सकते हैं
अंतर यह है कि एक EXE में एक प्रवेश बिंदु है, एक "मुख्य" विधि है जो निष्पादन पर चलेगी।
एक DLL के भीतर कोड को किसी अन्य एप्लिकेशन से कॉल करने की आवश्यकता होती है।
आपके द्वारा बताए गए ढांचे के संबंध में कुछ और मतभेद हैं।
Characteristics
सदस्य को देख सकता IMAGE_FILE_HEADER
है IMAGE_NT_HEADERS
। DLL के लिए, इसमें IMAGE_FILE_DLL
(0x2000) ध्वज है। EXE के लिए यह IMAGE_FILE_EXECUTABLE_IMAGE
(0x2) ध्वज है।IMAGE_OPTIONAL_HEADER
) ImageBase
सदस्य है। यह वर्चुअल पते को निर्दिष्ट करता है जिस पर पीई मानता है कि इसे लोड किया जाएगा। यदि इसे किसी अन्य पते पर लोड किया जाता है, तो कुछ संकेत गलत मेमोरी को इंगित कर सकते हैं। जैसे EXE फाइलें उनके नए एड्रेस स्पेस में लोड होने वाली पहली में से एक हैं, विंडोज लोडर एक निरंतर लोड एड्रेस को आश्वस्त कर सकता है और यह आमतौर पर 0x00400000 है। वह विलासिता एक DLL के लिए मौजूद नहीं है। एक ही प्रक्रिया में भरी हुई दो DLL फाइलें एक ही पते का अनुरोध कर सकती हैं। यही कारण है कि एक DLL के पास एक और डेटा निर्देशिका है, जिसे बेस रिलोकेशन डायरेक्टरी कहा जाता है, जो आमतौर पर अपने सेक्शन में रहती है - .reloc
। इस निर्देशिका में DLL में उन स्थानों की एक सूची है, जिन्हें पुन: व्यवस्थित / पैच किए जाने की आवश्यकता है ताकि वे सही मेमोरी की ओर इंगित करें। अधिकांश EXE फ़ाइलों में यह निर्देशिका नहीं है, लेकिन कुछ पुराने संकलक उन्हें उत्पन्न करते हैं।आप इस विषय पर अधिक पढ़ सकते हैं @ MSDN ।
यह उत्तर मेरे विचार से थोड़ा अधिक विस्तृत था, लेकिन इसके माध्यम से पढ़ा।
DLL:
ज्यादातर मामलों में, एक DLL फ़ाइल एक लाइब्रेरी है । पुस्तकालयों के कुछ प्रकार हैं, गतिशील और स्थिर - अंतर के बारे में पढ़ा । DLL गतिशील लिंक लाइब्रेरी के लिए खड़ा है, जो हमें बताता है कि यह कार्यक्रम का एक हिस्सा है, लेकिन पूरी बात नहीं है। यह पुन: प्रयोज्य सॉफ्टवेयर घटकों ( पुस्तकालय ) से बना है जिसे आप एक से अधिक प्रोग्राम के लिए उपयोग कर सकते हैं । यह ध्यान रखें कि कॉपी-पेस्ट का उपयोग करके कई अनुप्रयोगों में लाइब्रेरी सोर्स कोड का उपयोग करना हमेशा संभव होता है, लेकिन DLL / स्टेटिक लाइब्रेरी का विचार यह है कि आप लाइब्रेरी के कोड को अपडेट कर सकते हैं और उसी समय सभी एप्लिकेशन का उपयोग करके अपडेट कर सकते हैं यह - संकलन के बिना।
उदाहरण के लिए:
कल्पना कीजिए कि आप एक बटन की तरह एक Windows GUI घटक बना रहे हैं । अधिकांश मामलों में आप अपने द्वारा लिखे गए कोड का फिर से उपयोग करना चाहते हैं क्योंकि यह एक जटिल लेकिन एक सामान्य घटक है - आप इसका उपयोग करने के लिए कई एप्लिकेशन चाहते हैं लेकिन आप उन्हें स्रोत कोड नहीं देना चाहते हैं जिसे आप कॉपी नहीं कर सकते। -हर प्रोग्राम में बटन के लिए कोड पेस्ट करें, इसलिए आप तय करें कि आप DL-Library (DLL) बनाना चाहते हैं ।
इस "बटन" लाइब्रेरी को चलाने के लिए EXE कटेबल्स की आवश्यकता होती है , और इसके बिना वे नहीं चलेंगे क्योंकि वे नहीं जानते कि बटन कैसे बनाया जाए, केवल इससे कैसे बात करें।
इसी तरह, एक DLL निष्पादित नहीं किया जा सकता है, क्योंकि यह केवल कार्यक्रम का एक हिस्सा है, लेकिन "प्रक्रिया" बनाने के लिए आवश्यक जानकारी नहीं है ।
EXE:
एक निष्पादन योग्य प्रोग्राम है । यह जानता है कि एक प्रक्रिया कैसे बनाई जाए और DLL से कैसे बात की जाए। यह एक बटन बनाने के लिए DLL की जरूरत है , और इसके बिना आवेदन नहीं चलता है - ERROR।
उम्मीद है की यह मदद करेगा....
using SomeClassFromALibrary
, वह लाइब्रेरी DLL के माध्यम से प्रोजेक्ट से जुड़ी होती है? बस यह देखने की कोशिश कर रहा हूं कि क्या मैं सही ढंग से समझ रहा हूं
using
नामस्थानों के लिए कीवर्ड का उपयोग करते हैं , कक्षाओं के लिए नहीं। अपवाद using static
c # 6 से उपलब्ध है, जो निर्दिष्ट वर्ग ( लिंक ) में मौजूद सभी स्थिर सदस्यों को आयात करता है । using
कीवर्ड संकलक करने के लिए एक वादा जो रनटाइम के दौरान वहाँ कि युक्त एक पुस्तकालय हो जाएगा देता है नाम स्थान । पुस्तकालय उस DLL के माध्यम से परियोजना से जुड़ा नहीं है, DLL वह पुस्तकालय है जो परियोजना (असेंबली) से जुड़ा हुआ है। उस DLL में वह सभी कोड सम्मिलित हैं, जो संकलन समय में वादा किया गया था।
DLL और EXE दोनों पोर्टेबल एक्ज़ीक्यूटेबल (PE) प्रारूप हैं
एक गतिशील-लिंक लाइब्रेरी (DLL) एक पुस्तकालय है और इसलिए सीधे निष्पादित नहीं किया जा सकता है। यदि आप इसे चलाने का प्रयास करते हैं, तो आपको एक लापता प्रविष्टि बिंदु के बारे में एक त्रुटि मिलेगी। इसे निष्पादित करने के लिए एक प्रवेश बिंदु (मुख्य कार्य) की आवश्यकता होती है, वह प्रविष्टि बिंदु कोई भी आवेदन या निर्गमन हो सकता है। DLL बाइंडिंग रन-टाइम पर होती है। यही कारण है कि इसकी "डायनेमिक लिंक" लाइब्रेरी कहा जाता है।
एक निष्पादन योग्य (EXE) एक प्रोग्राम है जिसे निष्पादित किया जा सकता है। इसका अपना प्रवेश बिंदु है। पीई हेडर के अंदर एक ध्वज इंगित करता है कि यह किस प्रकार की फ़ाइल है (फ़ाइल एक्सटेंशन का अप्रासंगिक)। पीई हेडर में एक फ़ील्ड होता है जहाँ प्रोग्राम के लिए एंट्री पॉइंट रहता है। DLL में इसका उपयोग नहीं किया जाता है (या कम से कम प्रवेश बिंदु के रूप में नहीं)।
हेडर जानकारी की जांच करने के लिए कई सॉफ्टवेयर उपलब्ध हैं। केवल अंतर दोनों को अलग-अलग काम करने के कारण हेडर में थोड़ा सा है जैसा कि नीचे आरेख में दिखाया गया है।
EXE फ़ाइल में केवल एक ही मुख्य प्रविष्टि है इसका मतलब है कि यह अलग-थलग अनुप्रयोग है, जब कोई सिस्टम exe लॉन्च करता है, तो एक नई प्रक्रिया बनाई जाती है जबकि DLL में कई प्रवेश बिंदु होते हैं, इसलिए जब अनुप्रयोग इसका उपयोग करता है तो कोई नई प्रक्रिया शुरू नहीं होती है, DLL का पुन: उपयोग और संस्करण किया जा सकता है। DLL भंडारण स्थान को कम करता है क्योंकि विभिन्न प्रोग्राम एक ही dll का उपयोग कर सकते हैं।
.exe
या .dll
नहीं? यह हैडर में वह ध्वज है जो वास्तव में उन्हें अलग करता है .... इसलिए अगर मैं एक बनाता हूं exe
और इसे GUI इंटरैक्शन के रूप में एक के रूप में नाम देता हूं .dll
, लेकिन फिर उस ध्वज को मैन्युअल रूप से बदल देता है, तो यह अभी भी चलने योग्य है?
दो चीजें: एक्सटेंशन और हेडर झंडा फ़ाइल में संग्रहीत।
दोनों फाइलें पीई फाइलें हैं। दोनों में बिल्कुल समान लेआउट है। एक DLL एक पुस्तकालय है और इसलिए इसे निष्पादित नहीं किया जा सकता है। यदि आप इसे चलाने की कोशिश करते हैं तो आपको एक लापता प्रविष्टि बिंदु के बारे में एक त्रुटि मिलेगी। एक EXE एक प्रोग्राम है जिसे निष्पादित किया जा सकता है। इसका एक प्रवेश बिंदु है। पीई हेडर के अंदर एक ध्वज इंगित करता है कि यह किस फ़ाइल प्रकार का है (फ़ाइल एक्सटेंशन का अप्रासंगिक)। पीई हेडर में एक फ़ील्ड होता है जहाँ प्रोग्राम के लिए एंट्री पॉइंट रहता है। DLL में इसका उपयोग नहीं किया जाता है (या कम से कम प्रवेश बिंदु के रूप में नहीं)।
एक मामूली अंतर यह है कि ज्यादातर मामलों में DLL का एक निर्यात खंड होता है जहां प्रतीकों का निर्यात किया जाता है। EXE में कभी भी निर्यात खंड नहीं होना चाहिए क्योंकि वे पुस्तकालय नहीं हैं, लेकिन ऐसा कुछ भी नहीं होता है। Win32 लोडर किसी भी तरह से परवाह नहीं करता है।
इसके अलावा वे समान हैं। इसलिए, सारांश में, EXE निष्पादन योग्य कार्यक्रम हैं जबकि DLL एक प्रक्रिया में भरी हुई लाइब्रेरी हैं और इनमें कुछ प्रकार की उपयोगी कार्यक्षमता जैसे सुरक्षा, डेटाबेस एक्सेस या कुछ शामिल हैं।
Dll v / s Exe
1) DLL फाइल एक डायनेमिक लिंक लाइब्रेरी है, जिसका उपयोग exe फाइलों और अन्य dll फाइलों में किया जा सकता है।
EXE फ़ाइल एक निष्पादन योग्य फ़ाइल है जो एक अलग प्रक्रिया में चलती है जिसे OS द्वारा प्रबंधित किया जाता है।
2) DLL सीधे निष्पादन योग्य नहीं हैं। वे अलग-अलग फाइलें हैं जिनमें फ़ंक्शन और फ़ंक्शन और फ़ंक्शन करने के लिए अन्य DLL द्वारा कॉल किए जा सकने वाले फ़ंक्शंस हैं।
एक EXE एक प्रोग्राम है जिसे निष्पादित किया जा सकता है। Ex: विंडोज प्रोग्राम
3) पुन
: प्रयोज्य डीएलएल: उन्हें कुछ अन्य एप्लिकेशन के लिए पुन: उपयोग किया जा सकता है। जब तक कोडर DLL फ़ाइल में कार्यों और प्रक्रियाओं के नाम और मापदंडों को जानता है।
EXE: केवल विशिष्ट उद्देश्य के लिए।
4) एक DLL कॉलिंग एप्लिकेशन की एक ही प्रक्रिया और मेमोरी स्पेस साझा करेगा जबकि एक
EXE अपनी अलग प्रक्रिया और मेमोरी स्पेस बनाता है।
5)
डीएलएल का उपयोग करता है : आप इसका उपयोग करने के लिए कई एप्लिकेशन चाहते हैं, लेकिन आप उन्हें स्रोत कोड नहीं देना चाहते। आप हर प्रोग्राम में बटन के लिए कोड को कॉपी-पेस्ट नहीं कर सकते, इसलिए आप तय करते हैं कि आप डीएल बनाना चाहते हैं- पुस्तकालय (DLL)।
EXE: जब हम विंडोज फॉर्म्स एप्लिकेशन, कंसोल एप्लीकेशन, डब्ल्यूपीएफ एप्लिकेशन और विंडोज सर्विसेज जैसे प्रोजेक्ट टेम्प्लेट के साथ काम करते हैं, तो वे संकलित होने पर एक एक्सें असेंबली उत्पन्न करते हैं।
6) समानताएं:
DLL और EXE दोनों बाइनरी फाइलें हैं जो पोर्टेबल एक्सेसेबल प्रारूप द्वारा परिभाषित एक जटिल नेस्टेड संरचना है, और वे उपयोगकर्ताओं द्वारा संपादन योग्य नहीं हैं।
Theexe प्रोग्राम है। .Dll एक पुस्तकालय है जिसे .exe (या अन्य .dll) में कॉल किया जा सकता है।
क्या sakthivignesh कहते हैं कि इसमें सच हो सकता है। एक दूसरे का उपयोग कर सकते हैं जैसे कि यह एक पुस्तकालय था, और यह कुछ COM घटकों के साथ किया जाता है (उदाहरण के लिए)। इस मामले में, "दास" .exe एक अलग कार्यक्रम है (सख्ती से बोल रहा है, एक अलग प्रक्रिया - शायद एक अलग मशीन पर चल रहा है), लेकिन एक जो अन्य कार्यक्रमों / घटकों / जो कुछ भी से अनुरोधों को स्वीकार करता है और संभालता है।
हालाँकि, यदि आप सिर्फ एक यादृच्छिक .exe और .dll को अपने प्रोग्राम फ़ाइलों में फ़ोल्डर से चुनते हैं, तो संभावनाएं हैं कि COM प्रासंगिक नहीं है - वे सिर्फ एक प्रोग्राम और इसके गतिशील रूप से जुड़े पुस्तकालय हैं।
Win32 APIs का उपयोग करके, एक प्रोग्राम LoadLibrary और GetProcAddress API फ़ंक्शन, IICC का उपयोग करके DLL को लोड और उपयोग कर सकता है। Win16 में इसी तरह के कार्य थे।
COM कई मायनों में डीएलएल विचार का विकास है, जिसे मूल रूप से OLE2 के आधार के रूप में जाना जाता है, जबकि .NET COM का वंशज है। DLL विंडोज 1, IIRC के आसपास है। वे मूल रूप से मेमोरी उपयोग को कम करने के लिए कई चल रहे कार्यक्रमों के बीच बाइनरी कोड (विशेष रूप से सिस्टम एपीआई) साझा करने का एक तरीका थे।
एक EXE एक नियमित Win32 निष्पादन योग्य के रूप में सिस्टम को दिखाई देता है। इसका प्रवेश बिंदु एक छोटे लोडर को संदर्भित करता है जो .NET रनटाइम को इनिशियलाइज़ करता है और इसे EXE में निहित असेंबली को लोड और निष्पादित करने के लिए कहता है। एक DLL सिस्टम को Win32 DLL के रूप में दिखाई देता है, लेकिन बिना किसी प्रवेश बिंदु के सबसे अधिक संभावना है। .NET रनटाइम अपने हेडर में निहित असेंबली के बारे में जानकारी संग्रहीत करता है।
dll पुन: प्रयोज्य कार्यों का एक संग्रह है जहाँ .exe एक निष्पादन योग्य है जो इन कार्यों को कह सकता है
एक exe एक निष्पादन योग्य प्रोग्राम है जबकि A DLL एक फाइल है जिसे गतिशील रूप से प्रोग्राम द्वारा लोड और निष्पादित किया जा सकता है।
● .exe और dll c # कोड का संकलित संस्करण है जिसे असेंबली भी कहा जाता है।
● .exe एक स्टैंड अलोन एक्ज़ीक्यूटेबल फ़ाइल है, जिसका अर्थ है कि यह सीधे निष्पादित हो सकती है।
● .dll एक पुन: प्रयोज्य घटक है जिसे सीधे निष्पादित नहीं किया जा सकता है और इसे निष्पादित करने के लिए अन्य कार्यक्रमों की आवश्यकता होती है।
1) DLL एक इन-प्रोसेस कंपोनेंट है जिसका मतलब क्लाइंट प्रोसेस के समान मेमोरी स्पेस में चलना है। EXE एक आउट-प्रोसेस कंपोनेंट है जिसका मतलब है कि यह अपने अलग मेमोरी स्पेस में चलता है।
2) DLL में फ़ंक्शंस और प्रक्रियाएँ होती हैं जिनका अन्य प्रोग्राम उपयोग कर सकते हैं (पुन: प्रयोज्यता को बढ़ावा देते हैं) जबकि EXE को अन्य कार्यक्रमों के साथ साझा नहीं किया जा सकता है।
3) DLL को सीधे निष्पादित नहीं किया जा सकता है क्योंकि वे अन्य कार्यक्रमों द्वारा लोड और चलाने के लिए डिज़ाइन किए गए हैं। EXE एक प्रोग्राम है जिसे सीधे निष्पादित किया जाता है।
संक्षिप्त उत्तर पाने वालों के लिए,
यदि किसी असेंबली को एक क्लास लाइब्रेरी के रूप में संकलित किया जाता है और अन्य असेंबली के लिए उपयोग करने के लिए प्रकार प्रदान करता है, तो इसमें ifle एक्सटेंशन
.dll
(डायनेमिक लिंक लाइब्रेरी) है, और इसे स्टैंडअलोन निष्पादित नहीं किया जा सकता है।इसी तरह, यदि किसी असेंबली को एक एप्लिकेशन के रूप में संकलित किया जाता है, तो इसमें फ़ाइल एक्सटेंशन
.exe
(निष्पादन योग्य) है और इसे स्टैंडअलोन निष्पादित किया जा सकता है। .NET कोर 3.0 से पहले, कंसोल ऐप्स को .dll fles के लिए संकलित किया गया था और डॉटनेट रन कमांड या एक होस्ट निष्पादन योग्य द्वारा निष्पादित किया जाना था। - स्रोत
DLL और EXE के बीच प्रमुख सटीक अंतर है कि DLL को प्रवेश बिंदु नहीं मिला है और EXE करता है। यदि आप c ++ से परिचित हैं तो आप देख सकते हैं कि निर्माण EXE में मुख्य () एंट्री फ़ंक्शन है और DLL नहीं है :)