Різниця між .dll та .exe?


91

Я хочу знати точну різницю між файлами dll та exe.


1
Сюди слід додати якийсь контекст: Ви новачок? Ви шукаєте якусь глибоку технічну специфікацію PE-матеріалів чи щось інше
khebbie

3
Це правда, я новачок. Це інтерв’ю-запитання, позначене тегами.
Umesh Aawte

Що ще важливіше, це дублікат, включаючи той (видалений) sakthivignesh ...
Marc Gravell

Відповіді:


71

EXE:

  1. Це виконуваний файл
  2. При завантаженні виконуваного файлу не викликається експорт, а лише точка входу модуля.
  3. Коли система запускає новий виконуваний файл, створюється новий процес
  4. Потік введення викликається в контексті основного потоку цього процесу.

DLL:

  1. Це бібліотека динамічних посилань
  2. Є кілька експортованих символів.
  3. Система завантажує 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_EXE_and_a_DL_DL

Посилання: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx


9
Система завантажує DLL у існуючий ПРОЦЕС, а не в потік. Кожна DLL у процесі може отримати сповіщення про запуск або зупинку потоку за допомогою LibMainфункції.
Даніель Ервікер

13
Ваші пункти 1 і 2 невірні на 100%. Оскільки ви можете використовувати LoadLibraryEx на exe або dll, це означає, що ви можете використовувати GetProcAddress для завантаження точки входу з exe або dll. Тож у цьому відношенні файли exe та dll можуть бути динамічно пов’язані та мати будь-яку кількість точок входу.
jussij

132

Я не знаю, чому всі відповідають на це питання в контексті .NET. Питання було загальним і ніде не згадувало .NET.

Ну, основними відмінностями є:

EXE

  1. Exe завжди працює у власному адресному просторі, тобто це окремий процес.
  2. Мета EXE - запустити окремий власний додаток.

DLL

  1. Для запуску dll завжди потрібен хост-виконавець. тобто він ніколи не може працювати у власному адресному просторі.
  2. Призначення DLL полягає у створенні набору методів / класів, які можуть бути використані повторно з будь-якої іншої програми.
  3. DLL - це реалізація спільної бібліотеки корпорацією Майкрософт.

Формат файлів DLL та exe по суті однаковий. Windows розпізнає різницю між DLL та EXE через заголовок PE у файлі. Для отримання детальної інформації про заголовок PE ви можете подивитися цю статтю на MSDN


4
Отже, якщо ви хотіли, щоб ви перейменували та відредагували заголовок файлу, щоб перетворити dll на exe і навпаки?
RCIX,

@RCIX: Я сумніваюся, що це можливо?
VoodooChild

Швидше за все, це неможливо - див . Відповідь kichik нижче.
Джонатан Рейнхарт

31

Різниця полягає в тому, що EXE має точку входу, "основний" метод, який буде працювати під час виконання.

Код у DLL потрібно викликати з іншої програми.


11
Це неправильне завантаження, це означає, що бібліотеки DLL не мають точок входу. Бібліотеки DLL можуть мати основну точку входу DLL, яка викликається, коли (крім усього іншого) DLL завантажується в процес
jay.lee

29

Є ще кілька відмінностей щодо структури, яку ви могли б згадати.

  1. І DLL, і EXE мають однакову структуру файлу - Portable Executable або PE. Щоб розрізнити ці два, можна заглянути в Characteristicsчлен IMAGE_FILE_HEADERвсередині IMAGE_NT_HEADERS. Для DLL IMAGE_FILE_DLLувімкнено прапорець (0x2000). Для EXE це IMAGE_FILE_EXECUTABLE_IMAGE(0x2) прапор.
  2. Файли PE складаються з деяких заголовків і ряду розділів. Зазвичай є розділ коду, розділ даних, розділ із імпортованими функціями та розділ ресурсів. Деякі розділи можуть містити більше одного. Заголовок також описує список каталогів даних, які знаходяться в розділах. Ці каталоги даних - це те, що дозволяє Windows знаходити те, що їй потрібно в PE. Але одним із типів каталогів даних, якого EXE ніколи не буде (якщо ви не створюєте франкенштейн EXE), є каталог експорту. Тут файли DLL мають перелік функцій, які вони експортують, і можуть використовуватися іншими файлами EXE або DLL. З іншого боку, кожна бібліотека DLL та EXE має каталог імпорту, де перелічені функції та файли DLL, необхідні для запуску.
  3. Також у заголовках PE ( IMAGE_OPTIONAL_HEADER) є ImageBaseчлен. Він визначає віртуальну адресу, за якою PE вважає, що він буде завантажений. Якщо він завантажується за іншою адресою, деякі вказівники можуть вказувати на неправильну пам’ять. Оскільки файли EXE є одними з перших, які завантажуються у новий адресний простір, завантажувач Windows може забезпечити постійну адресу завантаження, і це зазвичай 0x00400000. Ця розкіш не існує для DLL. Два файли DLL, завантажені в один процес, можуть запитувати ту саму адресу. Ось чому DLL має інший каталог даних, який називається Base Relocation Directory, який зазвичай знаходиться у власному розділі - .reloc. Цей каталог містить список місць у DLL, які потрібно перебазувати / виправити, щоб вони вказували на потрібну пам’ять. Більшість файлів EXE не мають цього каталогу, але деякі старі компілятори їх генерують.

Ви можете прочитати більше на цю тему @ MSDN .


1
1. Оскільки це прапори, їх можна встановити одночасно. 2. Як ви вже сказали, це можливо, але навряд чи зникне. 3. ASLR також перемістить exe, якщо зможе. Так що так, навіть екс-може мати переїзд. Загалом, EXE, які є DLL, можливі, але рідкісні .
Дедулікатор

20

Ця відповідь була дещо докладнішою, ніж я думав, але прочитав її.

DLL:
У більшості випадків файл DLL є бібліотекою . Існує кілька типів бібліотек, динамічна та статична - читайте про різницю . DLL означає бібліотеку динамічних посилань, яка повідомляє нам, що це частина програми, але не вся справа. Він виготовлений із багаторазових програмних компонентів ( бібліотеки ), які ви можете використовувати для більш ніж однієї програми . Майте на увазі, що завжди можна використовувати вихідний код бібліотеки у багатьох програмах за допомогою copy-paste, але ідея бібліотеки DLL / Static полягає в тому, що ви можете оновити код бібліотеки і одночасно оновити всі програми, що використовують це - без компіляції.

Наприклад:
Уявіть, що ви створюєте компонент графічного інтерфейсу Windows на зразок кнопки . У більшості випадків ви хочете повторно використовувати написаний вами код, оскільки це складний, але загальний компонент - Ви хочете, щоб багато програм використовували його, але Ви не хочете надавати їм вихідний код. Ви не можете скопіювати -вставте код кнопки в кожну програму, щоб ви вирішили створити DL-бібліотеку (DLL) .

Ця бібліотека "кнопок" потрібна для запуску файлів EXE , і без неї вони не запускатимуться, оскільки вони не знають, як створити кнопку, лише як з нею розмовляти.

Подібним чином DLL не можна виконати - запустити, оскільки це лише частина програми, але не має інформації, необхідної для створення "процесу" .

EXE:
виконувана програма - це програма . Він знає, як створити процес і як розмовляти з DLL. Вона потребує в DLL , щоб створити кнопку, і без нього програма не запускається - ERROR.

сподіваюся, це допоможе ....


У світі розробки .NET, коли ви імпортуєте речі з інших модулів, як, наприклад, в C # using SomeClassFromALibrary, ця бібліотека пов’язана з проектом через DLL? Просто намагаюся зрозуміти, чи правильно я розумію
Абдул

Зазвичай ви використовуєте ключове слово usingдля просторів імен, а не класів. Виняток using staticдоступний з c # 6, який імпортує всі статичні члени, присутні у вказаному класі ( посилання ). usingКлючове слово дає обіцянку компілятору , що під час виконання там буде бібліотека , яка містить це простір імен . Бібліотека не пов'язана з проектом через цю DLL, DLL - це бібліотека, яка пов'язана з проектом (збіркою). Ця DLL містить весь код, який був обіцяний під час компіляції.
Дарій,

16

І DLL, і EXE є портативними виконуваними форматами (PE)

Бібліотека динамічного компонування (DLL) бібліотека і , отже , не може бути виконана безпосередньо. Якщо ви спробуєте запустити його, ви отримаєте повідомлення про відсутність точки входу. Для виконання потрібна точка входу (основна функція), цією точкою входу може бути будь-яка програма або exe. Прив'язка DLL відбувається під час виконання. Ось чому його називають бібліотекою "Динамічне посилання".

Executable (EXE) це програма , яка може бути виконана. Він має власну точку входу. Прапор у заголовку PE вказує, який це тип файлу (не має значення для розширення файлу). Заголовок PE має поле, де знаходиться точка входу для програми. У DLL вона не використовується (або, принаймні, не як точка входу).

Існує багато програмного забезпечення для перевірки інформації заголовка. Єдина різниця, що змушує обидва працювати по-різному, - це біт у заголовку, як показано на діаграмі нижче.

заголовок

Файл EXE має лише один основний запис, що означає, що це ізольований додаток; коли система запускає exe, створюється новий процес, тоді як DLL має багато точок входу, тому, коли програма використовує його, жоден новий процес не запускається, DLL може бути використаний повторно та встановлений у версіях. DLL зменшує простір для зберігання, оскільки різні програми можуть використовувати одну і ту ж DLL.


3
Ви кажете: "Прапор у заголовку PE вказує, який це тип файлу (не має значення для розширення файлу)" --- Так це означає, чи є розширення .exeчи .dllне має значення? Це той прапор у заголовку, який по-справжньому їх відрізняє .... Тож, якщо я буду робити exeі називати його за допомогою взаємодії з графічним інтерфейсом як.dll , але потім змінюю цей прапор вручну, він все ще може працювати?
Абдул

4

Дві речі: розширення та прапор заголовка, що зберігаються у файлі.

Обидва файли є PE-файлами. Обидва містять абсолютно однаковий макет. DLL є бібліотекою і тому не може бути запущена. Якщо ви спробуєте запустити його, ви отримаєте повідомлення про відсутність точки входу. EXE - це програма, яку можна виконати. Він має точку входу. Прапор у заголовку PE вказує, який це тип файлу (не має значення для розширення файлу). Заголовок PE має поле, де знаходиться точка входу для програми. У DLL вона не використовується (або, принаймні, не як точка входу).

Одна незначна відмінність полягає в тому, що в більшості випадків бібліотеки DLL мають розділ експорту, куди експортуються символи. EXE ніколи не повинні мати розділ експорту, оскільки вони не є бібліотеками, але ніщо не заважає цьому статися. Завантажувачу Win32 все одно не важливо.

Крім того, що вони ідентичні. Отже, підсумовуючи, EXE є виконуваними програмами, тоді як DLL - це бібліотеки, завантажені в процес, і містять якусь корисну функціональність, таку як безпека, доступ до бази даних чи щось інше.


3
+1: Так мало хто усвідомлює, що технічно різниця полягає лише в одному
біті

Цікаво, що сталося б в інтерв’ю, якби ви відповіли так. Їх: "Яка різниця між DLL та EXE?" Ви: "Один біт".
JMI MADISON

4

Dll v / s Exe

1) Файл DLL - це динамічна бібліотека посилань, яка може бути використана у файлах exe та інших файлах dll.
Файл EXE - це виконуваний файл, який працює в окремому процесі, яким керує ОС.

2) Бібліотеки DLL безпосередньо не виконуються. Це окремі файли, що містять функції, які можуть викликати програми та інші бібліотеки DLL для виконання обчислень та функцій.
EXE - це програма, яку можна виконати. Приклад: програма Windows

3)
DLL для багаторазового використання : їх можна використовувати повторно для інших програм. Поки кодер знає імена та параметри функцій та процедур у файлі DLL.
EXE: Лише для конкретної мети.

4) DLL поділятиме той самий процес і простір пам'яті програми, що викликає, тоді як
EXE створює свій окремий процес і простір пам'яті.

5) Використовує
DLL: Ви хочете, щоб багато програм використовували його, але Ви не хочете надавати їм вихідний код. Ви не можете скопіювати та вставити код кнопки в кожну програму, тому Ви вирішили створити DL- Бібліотека (DLL).

EXE: Коли ми працюємо з шаблонами проектів, такими як Windows Forms Applications, Console Applications, WPF Applications та Windows Services, вони генерують exe-збірку при компіляції.

6) Подібності:
І DLL, і EXE - це двійкові файли, що мають складну вкладену структуру, визначену форматом Portable Executable, і вони не призначені для редагування користувачами.


2

.Exe - це програма. .Dll - це бібліотека, в яку може входити .exe (або інша .dll).

Те, що каже sakthivignesh, може бути правдою в тому, що один .exe може використовувати інший, ніби це бібліотека, і це робиться (наприклад) з деякими COM-компонентами. У цьому випадку "slave" .exe є окремою програмою (строго кажучи, окремим процесом - можливо, працює на окремій машині), але такою, яка приймає та обробляє запити від інших програм / компонентів / чого завгодно.

Однак, якщо ви просто вибрали випадкові файли .exe та .dll з папки у ваших програмних файлах, шанси на те, що COM не є актуальним - це лише програма та її динамічно пов'язані бібліотеки.

Використовуючи API Win32, програма може завантажувати та використовувати DLL за допомогою функцій LoadLibrary та GetProcAddress API, IIRC. У Win16 були подібні функції.

COM багато в чому є еволюцією ідеї DLL, спочатку розробленої як основа для OLE2, тоді як .NET є нащадком COM. Бібліотеки DLL існують з часів Windows 1, IIRC. Спочатку вони були способом спільного використання двійкового коду (зокрема системних API) між кількома запущеними програмами з метою мінімізації використання пам'яті.


2

EXE видно системі як звичайний виконуваний файл Win32. Його точка входу відноситься до невеликого завантажувача, який ініціалізує час виконання .NET і повідомляє йому про завантаження та виконання збірки, що міститься в EXE. DLL видно системі як DLL Win32, але, швидше за все, без точок входу. Виконавець .NET зберігає інформацію про вміщену збірку у власному заголовку.

dll - це колекція багаторазових функцій, де як .exe є виконуваним файлом, який може викликати ці функції


1
Час виконання .NET не має нічого спільного з .exe або .dll, це двійкові файли машинного коду (якщо вони створені на якійсь мові програмування, яка використовує середовище виконання .NET, тоді виконується .NET, але це вже відповідальність exe-код, а не завантажувач ОС).
Ped7g

1

Exe - це виконувана програма, тоді як DLL - це файл, який програми можуть завантажувати та виконувати динамічно.


6
Хтось, мабуть, відчував, що ваша відповідь недостатньо детальна.
JesperE

так, люди можуть не знати, що таке виконувана програма, і це стає самим новим питанням.
Бездумний

1

● .exe та dll - це компільована версія коду c #, яка також називається збірками.

● .exe - це самостійний виконуваний файл, що означає, що він може виконуватися безпосередньо.

● .dll - компонент багаторазового використання, який неможливо виконати безпосередньо, і для його виконання потрібні інші програми.


0

Різниця в DLL та EXE:

1) DLL - це вбудований компонент, що означає роботу в тому ж просторі пам'яті, що і клієнтський процес. EXE - це позакомпонентний компонент, що означає, що він працює у своєму окремому просторі пам'яті.

2) DLL містить функції та процедури, які можуть використовувати інші програми (підвищує зручність використання), тоді як EXE не можна надавати спільний доступ до інших програм.

3) DLL неможливо виконати безпосередньо, оскільки вони призначені для завантаження та запуску іншими програмами. EXE - це програма, яка виконується безпосередньо.


-1

Будь ласка, коментуйте під час голосування.

Для тих, хто шукає стислу відповідь,

  • Якщо збірка скомпільована як бібліотека класів і надає типи для використання інших збірок, тоді вона має розширення ifle .dll (динамічна бібліотека посилань), і її неможливо виконати автономно.

  • Подібним чином, якщо збірка скомпільована як додаток, тоді вона має розширення файлу .exe(виконуваний файл) і може виконуватися автономно. До .NET Core 3.0 консольні програми компілювались у файли .dll і мали виконуватися командою dotnet run або виконуваним файлом хоста. - Джерело


-2

Основна точна різниця між DLL та EXE полягає в тому, що DLL не має точки входу, а EXE. Якщо ви знайомі з c ++, ви можете побачити, що збірка EXE має функцію введення main (), а DLL немає :)


Не думайте. Подивіться тут msdn.microsoft.com/en-us/library/ms682596(VS.85).aspx
Аамір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.