Что такое DLL-файлы и как они работают? - PullRequest
188 голосов
/ 24 сентября 2008

Как именно работают DLL-файлы? Кажется, их очень много, но я не знаю, кто они и как они работают.

Итак, что с ними?

Ответы [ 8 ]

247 голосов
/ 24 сентября 2008

Что такое DLL?

Библиотеки динамических ссылок (DLL) похожи на EXE-файлы, но они не являются исполняемыми напрямую. Они похожи на .so файлы в Linux / Unix. То есть библиотеки DLL являются реализацией разделяемых библиотек MS.

DLL так похожи на EXE, что сам формат файла такой же. И EXE, и DLL основаны на формате файла Portable Executable (PE). DLL также могут содержать компоненты COM и библиотеки .NET.

Что содержит DLL?

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

Типы библиотек:

Практически во всех операционных системах существует 2 типа библиотек. Статические библиотеки и динамические библиотеки. В Windows расширения файлов следующие: статические библиотеки (.lib) и динамические библиотеки (.dll). Основное отличие состоит в том, что статические библиотеки связаны с исполняемым файлом во время компиляции; тогда как динамически связанные библиотеки не связаны до времени выполнения.

Подробнее о статических и динамических библиотеках:

Обычно вы не видите статические библиотеки на вашем компьютере, потому что статическая библиотека встроена непосредственно в модуль (EXE или DLL). Динамическая библиотека - это отдельный файл.

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

Загрузка DLL:

Программа загружает DLL при запуске, через Win32 API LoadLibrary или когда она зависит от другой DLL. Программа использует GetProcAddress для загрузки функции или LoadResource для загрузки ресурса.

Подробнее:

Пожалуйста, проверьте MSDN или Википедия для дальнейшего чтения. Также источники этого ответа.

34 голосов
/ 24 сентября 2008

Что такое DLL?

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

Они важны?

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

Для файлов DLL могут потребоваться другие файлы DLL

Точно так же, как для приложения требуется файл DLL, файл DLL может зависеть от других файлов DLL. Если один из этих файлов DLL в цепочке зависимостей не найден, приложение не загрузится. Это легко отлаживается с помощью любых инструментов обхода зависимостей, таких как Dependency Walker .

В системных папках их так много

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

Установленные приложения также используют файлы DLL

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

DLL Hell

Однако при обновлении системы иногда происходит сбой других программ, когда существует несоответствие версий между общими файлами DLL и программой, которая требует их. Системные контрольные точки, DLL-кеш и т. Д. Были инициативой M $ для решения этой проблемы. Платформа .NET может вообще не сталкиваться с этой проблемой.

Как мы узнаем, что находится внутри DLL-файла?

Вы должны использовать внешний инструмент, такой как DUMPBIN или Dependency Walker, который будет не только показывать, какие общедоступные функции (известные как экспорты) содержатся внутри файлов DLL, а также какие другие файлы DLL ему требуются, и который экспортирует из тех файлов DLL, от которых зависит этот файл DLL.

Как мы их создаем / используем?

Обратитесь к документации по программированию от вашего поставщика. Для C ++, обратитесь к LoadLibrary в MSDN.

13 голосов
/ 24 сентября 2008

Допустим, вы создаете исполняемый файл, который использует некоторые функции из библиотеки.

Если используемая вами библиотека static , компоновщик скопирует объектный код для этих функций непосредственно из библиотеки и вставит их в исполняемый файл.

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

Если библиотека динамическая , компоновщик не вставит объектный код, а вставит заглушку, которая в основном говорит, что эта функция находится в этой DLL в этом месте.

Теперь, если этот исполняемый файл запущен, биты исполняемого файла отсутствуют (т. Е. Заглушки), поэтому загрузчик просматривает исполняемый файл, исправляя отсутствующие заглушки. Только после того, как все заглушки будут разрешены, исполняемый файл будет разрешен к запуску.

Чтобы увидеть это в действии, удалите или переименуйте библиотеку DLL и посмотрите, как загрузчик сообщит об отсутствующей ошибке DLL при попытке запустить исполняемый файл.

Отсюда и название Dynamic Link Library , части процесса компоновки выполняются динамически во время выполнения исполняемым загрузчиком.

Последнее замечание: если вы не создадите ссылку на DLL, компоновщик не вставит заглушки, но Windows по-прежнему предоставляет API GetProcAddress , который позволяет загрузить функцию исполнения DLL. точка входа после запуска исполняемого файла.

12 голосов
/ 24 сентября 2008

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

Статические библиотеки вставляются в исполняемый файл во время компиляции и исправляются с этого момента. Они увеличивают размер исполняемого файла и не могут быть общими.

Динамические библиотеки имеют следующие преимущества:

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

2 / Поскольку они независимы, код может совместно использоваться несколькими исполняемыми файлами - это экономит память, поскольку, если вы запускаете 100 приложений с одной DLL, в памяти может быть только одна копия DLL.

Их основным недостатком является преимущество # 1 - независимость от изменения DLL может привести к тому, что ваше приложение перестанет работать или начнет вести себя странным образом. Управление версиями DLL, как правило, не очень хорошо управляется в Windows, и это приводит к странному названию «DLL Hell».

10 голосов
/ 24 сентября 2008

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

С этой информацией вызывающая программа может затем вызывать функции в DLL, даже если у нее не было доступа к DLL во время компиляции.

Знакомство с динамическими библиотеками ссылок содержит дополнительную информацию.

6 голосов
/ 24 сентября 2008

http://support.microsoft.com/kb/815065

DLL - это библиотека, которая содержит код и данные, которые могут быть использованы более чем одна программа одновременно. За Например, в операционных системах Windows, библиотека Comdlg32 выполняет общие диалоговое окно, связанное с функциями. Поэтому каждая программа может использовать функциональность, которая содержится в эта DLL для реализации диалога Open коробка. Это помогает продвигать повторное использование кода и эффективное использование памяти.

Используя DLL, программа может быть модульный в отдельные компоненты. Например, бухгалтерская программа может быть проданным по модулю. Каждый модуль может быть загружается в основную программу при запуске время, если этот модуль установлен. Поскольку модули являются отдельными, время загрузки программы быстрее, и модуль загружается только тогда, когда функциональность запрашивается.

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

http://en.wikipedia.org/wiki/Dynamic-link_library

2 голосов
/ 21 июля 2017

DLL является расширением файла и известно как формат файла «динамически подключаемой библиотеки», используемый для хранения нескольких кодов и процедур для программ Windows. Software & Games работает на основе DLL-файлов; Файлы DLL были созданы таким образом, чтобы несколько приложений могли использовать их информацию одновременно.

Если вы хотите получить больше информации о DLL-файлах или о любой ошибке, прочитайте следующий пост. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

1 голос
/ 24 сентября 2008

DLL (библиотеки динамической компоновки) содержат ресурсы, используемые одним или несколькими приложениями или службами. Они могут содержать классы, значки, строки, объекты, интерфейсы и почти все, что нужно хранить разработчику, кроме интерфейса пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...