Любой, кто когда-либо пользовался Windows, особенно ее более ранними версиями, вероятно, сталкивался со странными ошибками DLL, появляющимися совершенно внезапно. Хотя файлы DLL кажутся действительно важными, учитывая как часто Windows жалуется на их отсутствие или невозможность работы, не совсем понятно что они собой представляют. Давайте разберемся почему же они имеют такое большое значение.
Назначение DLL в Windows
Аббревиатура DLL расшифровывается как Dynamic Link Library (динамически подключаемая библиотека). Причина, по которой их называют библиотеками, заключается в том, что библиотеки DLL содержат общий программный код, к которому могут обращаться и использовать сразу несколько программ. Это можно сравнить с тем, как в настоящих библиотеках есть общие для всех читателей книги. С другой стороны, библиотеки DLL несут в себе важную функцию, которой нет в книгах: несколько программ могут одновременно использовать одну и ту же библиотеку DLL. Как только DLL загружается в определенное место оперативной памяти, любая программа, которой нужен код внутри нее, может запросить доступ к этому пространству памяти, без необходимости повторной загрузки DLL.
Хорошим примером такого принципа взаимодействия является файл DLL comdlg32.dll, который содержит программный код для вызова всплывающего диалогового окна Windows. Так как многие программы используют эту функцию, имеет смысл включить этот код в Windows в качестве DLL, а не добавлять его в каждую программу каждый раз.
Другим хорошим примером являются драйверы устройств, представляющие собой программный код, позволяющий Windows и другим программам правильно взаимодействовать с оборудованием. Драйверы зачастую представлены в форме DLL, хотя могут и отображаться в виде файлов .sys в проводнике Windows, и это позволяет обеспечить одновременный доступ нескольких приложений к вашей видеокарте, клавиатуре или принтеру и его драйверам.
Поскольку библиотеки DLL загружаются только тогда, когда программа специально запрашивает их, а не каждый раз при запуске приложения, то это также предотвращает переполнение оперативной памяти тоннами ненужного кода. Такая модульность означает, что новые функции, такие как обновления для игр или поддержка других языков программирования, могут быть добавлены к старым приложениям путем простого написания новых библиотек DLL, а не через внесение изменений в код самой программы. Это не только удобнее, но также и исключает риск непреднамеренного возникновения ошибок в коде основного исполняемого файла.
Проблемы библиотек DLL
Тогда если библиотеки DLL это так здорово, почему же они приобрели столь дурную славу? Одна из основных причин, по которой DLL вызывают столько проблем, заключается в том, что когда приложение зависит от многих библиотек DLL, это также означает, что приложение имеет множество возможных точек отказа. Если DLL модифицируется какой-нибудь одной программой, то нет никаких гарантий, что новый код совместим со всеми остальными приложениями. В таком случае остальные программы зачастую просто аварийно завершают работу.
Некоторые приложения взаимодействуют с DLL таким образом, как на самом деле не должны были бы. Установщик программы, например, может модифицировать определенные DLL так, чтобы помочь конкретному приложению, что устанавливает, но с другой стороны приведет к ошибкам в работе множества других программ, нуждающихся в той же самой DLL и несовместимых с измененной версией.
Долгое время Microsoft требовала, чтобы сторонние разработчики программного обеспечения проверяли устанавливаемые DLL на соответствие принятым стандартам, в особенности если они перезаписывают существующие библиотеки. Вероятно нет нужды говорить, что поскольку разработчики, как правило, больше заботятся о том, чтобы их собственное программное обеспечение работало как надо, этого зачастую просто не происходило, и установщики продолжали безнаказанно устанавливать проблемные библиотеки DLL.
К счастью, эта проблема была в значительной степени устранена в более поздних версиях Windows. Microsoft заблокировала системные библиотеки DLL так, чтобы сторонние приложения не могли их модифицировать, если только изменения не были авторизованы самой Microsoft. Теперь Windows может отслеживать установки DLL, чтобы предотвратить попадание неизвестных библиотек в систему, а также разрешить одновременное существование двух разных версий DLL для предотвращения ошибок в программах, использующих более старые версии, при установке новых.
NVMe SSD накопители PCIe 4.0 со скидкой
Учитывая же то, что современные ПК имеют гораздо больше оперативной памяти, чем компьютеры 90-х и начала 2000-х годов, ограничения памяти, которые в прошлом требовали использования библиотек DLL, сегодня не так распространены. Это означает, что современные программы часто не так сильно полагаются на библиотеки DLL. Возможно, установка 64 гигабайт оперативной памяти в вашу сборку не было такой уж плохой идеей.