Я хочу знати точну різницю між файлами dll та exe.
Я хочу знати точну різницю між файлами dll та exe.
Відповіді:
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_EXE_and_a_DL_DL
Посилання: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx
LibMain
функції.
Я не знаю, чому всі відповідають на це питання в контексті .NET. Питання було загальним і ніде не згадувало .NET.
Ну, основними відмінностями є:
EXE
DLL
Формат файлів DLL та exe по суті однаковий. Windows розпізнає різницю між DLL та EXE через заголовок PE у файлі. Для отримання детальної інформації про заголовок PE ви можете подивитися цю статтю на 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
член. Він визначає віртуальну адресу, за якою PE вважає, що він буде завантажений. Якщо він завантажується за іншою адресою, деякі вказівники можуть вказувати на неправильну пам’ять. Оскільки файли EXE є одними з перших, які завантажуються у новий адресний простір, завантажувач Windows може забезпечити постійну адресу завантаження, і це зазвичай 0x00400000. Ця розкіш не існує для DLL. Два файли DLL, завантажені в один процес, можуть запитувати ту саму адресу. Ось чому DLL має інший каталог даних, який називається Base Relocation Directory, який зазвичай знаходиться у власному розділі - .reloc
. Цей каталог містить список місць у DLL, які потрібно перебазувати / виправити, щоб вони вказували на потрібну пам’ять. Більшість файлів EXE не мають цього каталогу, але деякі старі компілятори їх генерують.Ви можете прочитати більше на цю тему @ MSDN .
Ця відповідь була дещо докладнішою, ніж я думав, але прочитав її.
DLL:
У більшості випадків файл DLL є бібліотекою . Існує кілька типів бібліотек, динамічна та статична - читайте про різницю . DLL означає бібліотеку динамічних посилань, яка повідомляє нам, що це частина програми, але не вся справа. Він виготовлений із багаторазових програмних компонентів ( бібліотеки ), які ви можете використовувати для більш ніж однієї програми . Майте на увазі, що завжди можна використовувати вихідний код бібліотеки у багатьох програмах за допомогою copy-paste, але ідея бібліотеки DLL / Static полягає в тому, що ви можете оновити код бібліотеки і одночасно оновити всі програми, що використовують це - без компіляції.
Наприклад:
Уявіть, що ви створюєте компонент графічного інтерфейсу Windows на зразок кнопки . У більшості випадків ви хочете повторно використовувати написаний вами код, оскільки це складний, але загальний компонент - Ви хочете, щоб багато програм використовували його, але Ви не хочете надавати їм вихідний код. Ви не можете скопіювати -вставте код кнопки в кожну програму, щоб ви вирішили створити DL-бібліотеку (DLL) .
Ця бібліотека "кнопок" потрібна для запуску файлів EXE , і без неї вони не запускатимуться, оскільки вони не знають, як створити кнопку, лише як з нею розмовляти.
Подібним чином DLL не можна виконати - запустити, оскільки це лише частина програми, але не має інформації, необхідної для створення "процесу" .
EXE:
виконувана програма - це програма . Він знає, як створити процес і як розмовляти з DLL. Вона потребує в DLL , щоб створити кнопку, і без нього програма не запускається - ERROR.
сподіваюся, це допоможе ....
using SomeClassFromALibrary
, ця бібліотека пов’язана з проектом через DLL? Просто намагаюся зрозуміти, чи правильно я розумію
using
для просторів імен, а не класів. Виняток using static
доступний з c # 6, який імпортує всі статичні члени, присутні у вказаному класі ( посилання ). using
Ключове слово дає обіцянку компілятору , що під час виконання там буде бібліотека , яка містить це простір імен . Бібліотека не пов'язана з проектом через цю DLL, DLL - це бібліотека, яка пов'язана з проектом (збіркою). Ця DLL містить весь код, який був обіцяний під час компіляції.
І DLL, і EXE є портативними виконуваними форматами (PE)
Бібліотека динамічного компонування (DLL) бібліотека і , отже , не може бути виконана безпосередньо. Якщо ви спробуєте запустити його, ви отримаєте повідомлення про відсутність точки входу. Для виконання потрібна точка входу (основна функція), цією точкою входу може бути будь-яка програма або exe. Прив'язка DLL відбувається під час виконання. Ось чому його називають бібліотекою "Динамічне посилання".
Executable (EXE) це програма , яка може бути виконана. Він має власну точку входу. Прапор у заголовку PE вказує, який це тип файлу (не має значення для розширення файлу). Заголовок PE має поле, де знаходиться точка входу для програми. У DLL вона не використовується (або, принаймні, не як точка входу).
Існує багато програмного забезпечення для перевірки інформації заголовка. Єдина різниця, що змушує обидва працювати по-різному, - це біт у заголовку, як показано на діаграмі нижче.
Файл EXE має лише один основний запис, що означає, що це ізольований додаток; коли система запускає exe, створюється новий процес, тоді як DLL має багато точок входу, тому, коли програма використовує його, жоден новий процес не запускається, DLL може бути використаний повторно та встановлений у версіях. DLL зменшує простір для зберігання, оскільки різні програми можуть використовувати одну і ту ж DLL.
.exe
чи .dll
не має значення? Це той прапор у заголовку, який по-справжньому їх відрізняє .... Тож, якщо я буду робити exe
і називати його за допомогою взаємодії з графічним інтерфейсом як.dll
, але потім змінюю цей прапор вручну, він все ще може працювати?
Дві речі: розширення та прапор заголовка, що зберігаються у файлі.
Обидва файли є PE-файлами. Обидва містять абсолютно однаковий макет. DLL є бібліотекою і тому не може бути запущена. Якщо ви спробуєте запустити його, ви отримаєте повідомлення про відсутність точки входу. EXE - це програма, яку можна виконати. Він має точку входу. Прапор у заголовку PE вказує, який це тип файлу (не має значення для розширення файлу). Заголовок PE має поле, де знаходиться точка входу для програми. У DLL вона не використовується (або, принаймні, не як точка входу).
Одна незначна відмінність полягає в тому, що в більшості випадків бібліотеки DLL мають розділ експорту, куди експортуються символи. EXE ніколи не повинні мати розділ експорту, оскільки вони не є бібліотеками, але ніщо не заважає цьому статися. Завантажувачу Win32 все одно не важливо.
Крім того, що вони ідентичні. Отже, підсумовуючи, EXE є виконуваними програмами, тоді як DLL - це бібліотеки, завантажені в процес, і містять якусь корисну функціональність, таку як безпека, доступ до бази даних чи щось інше.
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, і вони не призначені для редагування користувачами.
.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) між кількома запущеними програмами з метою мінімізації використання пам'яті.
EXE видно системі як звичайний виконуваний файл Win32. Його точка входу відноситься до невеликого завантажувача, який ініціалізує час виконання .NET і повідомляє йому про завантаження та виконання збірки, що міститься в EXE. DLL видно системі як DLL Win32, але, швидше за все, без точок входу. Виконавець .NET зберігає інформацію про вміщену збірку у власному заголовку.
dll - це колекція багаторазових функцій, де як .exe є виконуваним файлом, який може викликати ці функції
● .exe та dll - це компільована версія коду c #, яка також називається збірками.
● .exe - це самостійний виконуваний файл, що означає, що він може виконуватися безпосередньо.
● .dll - компонент багаторазового використання, який неможливо виконати безпосередньо, і для його виконання потрібні інші програми.
1) DLL - це вбудований компонент, що означає роботу в тому ж просторі пам'яті, що і клієнтський процес. EXE - це позакомпонентний компонент, що означає, що він працює у своєму окремому просторі пам'яті.
2) DLL містить функції та процедури, які можуть використовувати інші програми (підвищує зручність використання), тоді як EXE не можна надавати спільний доступ до інших програм.
3) DLL неможливо виконати безпосередньо, оскільки вони призначені для завантаження та запуску іншими програмами. EXE - це програма, яка виконується безпосередньо.
Для тих, хто шукає стислу відповідь,
Якщо збірка скомпільована як бібліотека класів і надає типи для використання інших збірок, тоді вона має розширення ifle
.dll
(динамічна бібліотека посилань), і її неможливо виконати автономно.Подібним чином, якщо збірка скомпільована як додаток, тоді вона має розширення файлу
.exe
(виконуваний файл) і може виконуватися автономно. До .NET Core 3.0 консольні програми компілювались у файли .dll і мали виконуватися командою dotnet run або виконуваним файлом хоста. - Джерело
Основна точна різниця між DLL та EXE полягає в тому, що DLL не має точки входу, а EXE. Якщо ви знайомі з c ++, ви можете побачити, що збірка EXE має функцію введення main (), а DLL немає :)