Разница между .dll и .exe?

92

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

Умеш Аауте
источник
1
Вы должны добавить здесь некоторый контекст: вы новичок? Ищете ли вы какую-то глубокую техническую спецификацию материала PE или что-то еще
khebbie
3
Верно, я новичок. Это вопрос-интервью, помеченный.
Umesh Aawte
Что еще более важно, это дубликат, в том числе один (удален) sakthivignesh ...
Марк Грейвелл

Ответы:

73

ИСПОЛНЯЕМЫЙ:

  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_D

Ссылка: 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
136

Я не знаю, почему все отвечают на этот вопрос в контексте .NET. Вопрос был общим и нигде не упоминал .NET.

Что ж, основные отличия заключаются в следующем:

исполняемый

  1. EXE всегда выполняется в собственном адресном пространстве, т. Е. Это отдельный процесс.
  2. Назначение EXE - запустить отдельное собственное приложение.

DLL

  1. DLL всегда нуждается в хосте exe для запуска. т.е. он никогда не может работать в собственном адресном пространстве.
  2. Задача DLL - иметь набор методов / классов, которые можно повторно использовать из другого приложения.
  3. DLL - это реализация Microsoft разделяемой библиотеки.

Формат файлов DLL и exe практически одинаков. Windows распознает разницу между DLL и EXE через PE-заголовок в файле. Подробнее о заголовке PE можно прочитать в этой статье на MSDN.

Аамир
источник
4
Итак, если вы хотите, чтобы вы могли переименовать и отредактировать заголовок файла, чтобы превратить dll в exe и наоборот?
RCIX 05
@RCIX: Я сомневаюсь, что это возможно?
VoodooChild
Скорее всего, это невозможно - см . Ответ Кичика ниже.
Джонатон Рейнхарт
32

Разница в том, что у EXE есть точка входа, «основной» метод, который запускается при выполнении.

Код в DLL необходимо вызывать из другого приложения.

День Робина
источник
12
Это неправильная загрузка, это означает, что у DLL нет точек входа. Библиотеки DLL могут иметь точку входа DLLMain, которая вызывается, когда (среди прочего) DLL загружается в процесс
jay.lee
29

Вы могли бы упомянуть еще несколько отличий относительно структуры.

  1. И DLL, и EXE имеют одинаковую файловую структуру - Portable Executable или PE. Чтобы различить их, можно заглянуть внутрь Characteristicsчлена . Для библиотеки DLL установлен флаг (0x2000). Для EXE это флаг (0x2).IMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE
  2. PE-файлы состоят из нескольких заголовков и нескольких разделов. Обычно есть раздел для кода, раздел для данных, раздел со списком импортированных функций и раздел для ресурсов. Некоторые разделы могут содержать более одного элемента. Заголовок также описывает список каталогов данных, которые расположены в разделах. Эти каталоги данных позволяют Windows находить в PE то, что ей нужно. Но один из типов каталогов данных, который никогда не будет в EXE (если только вы не создаете EXE-файл frankenstein), - это каталог экспорта. Здесь файлы 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 .

кичик
источник
2
1. Поскольку это флаги, оба могут быть установлены одновременно. 2. Как вы сказали, это возможно, но исчезающе маловероятно. 3. ASLR также переместит исполняемый файл, если сможет. Так что да, даже у exe могут быть перестановки. В общем, EXE, которые являются DLL, возможны, но редко .
Дедупликатор
22

Этот ответ был немного более подробным, чем я думал, но прочитайте его.

DLL:
в большинстве случаев файл DLL представляет собой библиотеку . Есть несколько типов библиотек, динамические и статические - читайте о различиях . DLL выступает за динамическую связь библиотеки , которая говорит нам , что это часть программы , но не все это. Он состоит из многократно используемых программных компонентов ( библиотеки ), которые вы можете использовать более чем для одной программы . Имейте в виду, что всегда можно использовать исходный код библиотеки во многих приложениях с помощью копирования и вставки, но идея DLL / статической библиотеки заключается в том, что вы можете обновить код библиотеки и в то же время обновить все приложения, используя это - без компиляции.

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

Эта библиотека «кнопок» требуется для запуска EXE- файлов, и без нее они не будут работать, потому что они не знают, как создать кнопку, а знают только, как с ней разговаривать.

Точно так же DLL не может быть запущена - запущена, потому что это только часть программы, но не имеет информации, необходимой для создания «процесса» .

EXE:
исполняемый файл - это программа . Он знает, как создать процесс и как общаться с DLL. Она нуждается в DLL , чтобы создать кнопку, и без него приложение не запускается - ERROR.

надеюсь это поможет....

Хэннсон
источник
В мире разработки .NET, когда вы импортируете что-то из других модулей, например, из C # using SomeClassFromALibrary, эта библиотека связана с проектом через DLL? Просто пытаюсь понять, правильно ли я понимаю
Абдул
Обычно вы используете ключевое слово usingдля пространств имен, а не для классов. Исключение using staticдоступно для C # 6, который импортирует все статические члены, присутствующие в указанном классе ( ссылка ). usingКлючевое слово дает обещание компилятору , что во время выполнения там будет библиотека , содержащая это пространство имен . Библиотека не связана с проектом через эту DLL, DLL - это библиотека, связанная с проектом (сборкой). Эта DLL содержит весь код, обещанный во время компиляции.
Дарий
17

И DLL, и EXE являются форматами Portable Executable (PE)

Библиотека динамической компоновки (DLL) библиотека и , следовательно , не может быть выполнена непосредственно. Если вы попытаетесь запустить его, вы получите сообщение об отсутствии точки входа. Для его выполнения требуется точка входа (основная функция), этой точкой входа может быть любое приложение или exe. Связывание DLL происходит во время выполнения. Вот почему это называется библиотекой «Dynamic Link».

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

Для проверки информации заголовка доступно множество программ . Единственная разница, из-за которой оба работают по-разному, - это бит в заголовке, как показано на диаграмме ниже.

заголовок

EXE-файл имеет только одну основную запись, что означает, что это изолированное приложение, когда система запускает exe, создается новый процесс, в то время как библиотеки DLL имеют много точек входа, поэтому, когда приложение использует его, новый процесс не запускается, DLL можно повторно использовать и версировать. DLL уменьшает пространство для хранения, поскольку разные программы могут использовать одну и ту же dll.

Захир Ахмед
источник
3
Вы говорите: «Флаг внутри заголовка PE указывает, какой это тип файла (не имеет отношения к расширению файла)» --- Значит ли это, имеет ли это расширение значение .exeили .dllнет? Это тот флаг в заголовке, который действительно их отличает ... Так что, если я создам и назову exeего через взаимодействие с графическим интерфейсом как a .dll, но затем изменю этот флаг вручную, он все равно будет работать?
Абдул
6

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, консольные приложения, приложения WPF и службы Windows, они создают сборку exe при компиляции.

6) Сходства: как
DLL, так и EXE являются двоичными файлами, имеют сложную вложенную структуру, определяемую форматом Portable Executable, и они не предназначены для редактирования пользователями.

skanda93
источник
4

Две вещи: расширение и флаг заголовка, хранящиеся в файле.

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

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

В остальном они идентичны. Итак, вкратце, EXE - это исполняемые программы, а DLL - это библиотеки, загружаемые в процесс и содержащие какие-то полезные функции, такие как безопасность, доступ к базе данных или что-то еще.

Джуди Смит
источник
3
+1: Так мало людей осознают, что технически разница всего в одном бите в заголовке PE
Серж Вотье 08
Интересно, что бы произошло в интервью, если бы вы ответили таким образом. Они: «В чем разница между DLL и EXE?» Вы: «One Bit».
JMI MADISON
3

.Exe - это программа. .Dll - это библиотека, которую может вызывать .exe (или другая .dll).

То, что говорит sakthivignesh, может быть правдой в том, что один .exe может использовать другой, как если бы это была библиотека, и это делается (например) с некоторыми компонентами COM. В этом случае «подчиненный» .exe - это отдельная программа (строго говоря, отдельный процесс - возможно, запущенный на отдельной машине), но она принимает и обрабатывает запросы от других программ / компонентов / чего угодно.

Однако, если вы просто выберете случайные .exe и .dll из папки в ваших программных файлах, есть вероятность, что COM не имеет значения - это просто программа и ее динамически подключаемые библиотеки.

Используя Win32 API, программа может загружать и использовать DLL, используя функции LoadLibrary и GetProcAddress API, IIRC. Подобные функции были и в Win16.

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

Стив314
источник
2

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

dll - это набор многоразовых функций, где в качестве .exe - исполняемый файл, который может вызывать эти функции.

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

EXE - это исполняемая программа, тогда как DLL - это файл, который может загружаться и выполняться программами динамически.

Бхушан Бхангале
источник
6
Кто-то, наверное, посчитал ваш ответ недостаточно подробным.
JesperE
да, люди могут не знать, что такое исполняемая программа, и это само по себе становится совершенно новым вопросом.
Mindless
1

● .exe и dll - это скомпилированные версии кода C #, которые также называются сборками.

● .exe - это отдельный исполняемый файл, что означает, что он может выполняться напрямую.

● .dll - это компонент многократного использования, который нельзя запустить напрямую, и для его выполнения требуются другие программы.

Кедарнатх MS
источник
0

Разница в DLL и EXE:

1) DLL - это внутрипроцессный компонент, что означает работу в том же пространстве памяти, что и клиентский процесс. EXE - это компонент Out-Process, что означает, что он работает в собственном отдельном пространстве памяти.

2) DLL содержит функции и процедуры, которые могут использоваться другими программами (способствует повторному использованию), в то время как EXE не может использоваться совместно с другими программами.

3) DLL нельзя запускать напрямую, так как они предназначены для загрузки и запуска другими программами. EXE - это программа, которая выполняется напрямую.

Рахул Шарма
источник
0

Для тех, кто ищет краткий ответ,

  • Если сборка скомпилирована как библиотека классов и предоставляет типы для использования другими сборками, то она имеет расширение ifle .dll(библиотека динамической компоновки) и не может выполняться автономно.

  • Аналогично, если сборка скомпилирована как приложение, она имеет расширение файла .exe(исполняемый файл) и может выполняться автономно. До .NET Core 3.0 консольные приложения компилировались в файлы .dll и должны были выполняться командой dotnet run или исполняемым файлом хоста. - Источник

snr
источник
-2

Основное точное различие между DLL и EXE в том, что у DLL нет точки входа, а у EXE есть. Если вы знакомы с c ++, вы можете увидеть, что build EXE имеет функцию входа main (), а DLL нет :)

фая
источник
Не думаю. Посмотрите здесь msdn.microsoft.com/en-us/library/ms682596(VS.85).aspx
Аамир