Что именно представляют собой файлы DLL и как они работают?

224

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

Итак, что с ними делать?

stalepretzel
источник
6
Так как он помечен только для Windows, и этот вопрос был написан еще в 2008 году, стоит отметить, что в настоящее время dll работает на Mac и Linux также с .NET Core.
Джим Ахо

Ответы:

287

Что такое 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 или Википедию для дальнейшего чтения. Также источники этого ответа.

Брайан Р. Бонди
источник
5
Вероятно, следует упомянуть импорт lib где-нибудь. Хорошо, я сейчас уйду. :)
Адам Митц
2
Удалены те, которые кажутся адресованными. Как я могу получить очки за это? <g>
Адам Миц
36

Что такое DLL?

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

Они важны?

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

DLL-файлы могут требовать других DLL-файлов

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

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

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

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

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

DLL Ад

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

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

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

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

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

computinglife
источник
2
Пожалуйста, заполните это предложение ( "The .NET platform might not face this issue at all.") с помощью почему. Спасибо.
Jogi
1
@RehanKhan Начиная с .NET Framework v2.0, среда выполнения будет загружать только сборки, скомпилированные с версией .NET <= загруженная в данный момент среда выполнения. .NET также кэширует неудачные попытки загрузки сборок +, если предыдущий вызов уже обнаружил сборку, среда выполнения CL будет использовать уже загруженную сборку. В общем, я думаю, что лучше сказать, что они решили проблему, применяя очень жесткие ограничения на то, какие DLL будет загружать среда выполнения программы (прежде чем она просто сдастся и попросит вашей помощи).
Владислав Мартин
14

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

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

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

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

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

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

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

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

jussij
источник
12

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

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

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

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

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

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

paxdiablo
источник
11

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

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

Представляем Dynamic Link Libraries, есть еще немного информации.

Адам Пирс
источник
6

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

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

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

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

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

Хорхе Феррейра
источник
2

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

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

Акшья Нагар
источник
1

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

tsilb
источник
3
Они могут на самом деле хранить пользовательский интерфейс, и несколько программ делают это. Например оснастки.
Брайан Р. Бонди
1

По данным Microsoft

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

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

Если вы хотите подробное объяснение, проверьте эти полезные ресурсы

Что такое dll файлы , о dll файлах

построители кода
источник