Краткий ответ: загрузчик dll будет искать dll в локальной папке приложения, а затем искать во множестве системных расположений. Существуют сложности с манифестами, функцией SafeDllSearchMode
(влияет на порядок поиска в каталогах) и разработчиками, загружающими библиотеки DLL из настраиваемых мест путем переопределения (LoadLibraryEx) и некоторыми другими (см. Ниже).
Типы зависимостей. Существует множество типов зависимостей dll: Схема зависимостей модуля / dll.
Динамический- Порядок поиска в библиотеке ссылок: вот выдержка из Документы Microsoft по теме: Система может содержать несколько версий одной и той же библиотеки динамической компоновки (DLL). Приложения могут управлять расположением, из которого загружается DLL, путем указания полного пути или использования другого механизма, такого как манифест.
Другими словами, вы можете 1)
загрузить dll из определенного места или 2)
позволить ОС найти ее за вас с помощью стандартных механизмов. Параметр реестра "SafeDllSearchMode"
влияет на то, когда выполняется поиск в текущем каталоге пользователя. Теперь по умолчанию он включен, но его можно отключить. См. Ссылку выше для получения достоверных сведений. Остерегайтесь изменений ОС и исправлений безопасности - все это может повлиять на этот порядок в будущем.
Q1: всегда используйте среду выполнения, предоставленную для вашей зависимой библиотеки DLL, если она доступна. Не включайте просто несколько dll, если вам это не положено.
Q2: верно, что время выполнения часто сильно различается. Иногда это всего лишь одна или несколько dll, которые вы можете просто установить в свою локальную папку приложения. В других случаях вы устанавливаете среду выполнения, которая устанавливает файлы в соответствующие папки для общего использования. Некоторые среды выполнения поставляются как модули слияния, которые могут объединять файлы в ваш собственный установщик MSI, а некоторые - как отдельные установщики MSI или установщики setup.exe.
Q3: вся идея использования DLL , по сути, заключается в том, чтобы иметь возможность загружать один и тот же двоичный компонент во многие процессы, чтобы иметь возможность обновлять одну dll для устранения проблем у всех потребителей dll, а также совместно использовать их в памяти (что важно в те времена с небольшой памятью). Dll также можно загружать с задержкой - что означает, что они не будут загружаться до тех пор, пока они не понадобятся - во избежание чрезмерного увеличения памяти. Во всяком случае, это идея.
Версия ОС Windows. Порядок поиска (где искать на диске) нужных DLL для загрузки - довольно сложная тема. На то, как механизм загрузчика ОС обнаруживает библиотеки DLL, может влиять ряд факторов, например 1)
версия ОС, 2)
манифест, 3)
жестко запрограммированный измененные пути загрузки (LoadLibraryEx) или 4)
dll перенаправляет, и 5)
ранее загруженные библиотеки DLL в память (здесь драконы) и т. д.
UWP и .NET: есть также новые разработки в отношении Приложения UWP. Для сборок .NET разрешение снова другое (что вы заявляете), см. Эту статью: Как среда выполнения находит сборки.
WinSxS: манифест - это новая концепция в Windows: в былые времена такого не было бы, и порядок поиска был бы проще, но менее гибким. С появлением манифестов и параллельных сборок Win32 (несколько версий одной и той же библиотеки DLL, установленных в разных версиях) манифест встраивается в исполняемый файл (или добавляется извне) и сообщает двоичному файлу, где искать среду выполнения. dlls - в иерархии папок WinSxS
Windows (обычно: C:\Windows\WinSxS
), где могут находиться несколько версий одной и той же dll (в разных подпапках).
Большинство сред выполнения Microsoft - в основном все современные - находятся здесь и, следовательно, требуют манифеста, чтобы указать двоичному файлу, какую версию искать и загружать. Есть способы перенаправить и такие манифесты ... Файлы конфигурации издателя и 2. Вздох ... Это можно использовать для принудительного применения определенной новой версии среды выполнения, когда старая нежелательна для использования. Неиспользуемые среды выполнения также могут быть собраны в мусор с помощью способов сжатия папок WinSxS (См. Этот ответ - раздел Очистка / размещение WinSxS на диете) ... Хммм ... Никаких жестких кодовых путей к WinSxS.
Порядок поиска Dll: старый и устаревший инструмент Dependency Walker имеет устаревшее, но очень хорошее описание порядка поиска DLL в его файл справки.
Совет. Обновленная документация по этому поводу: Документы Microsoft: порядок поиска модулей для настольных приложений em>. Однако, чтобы получить приблизительное представление о порядке поиска, вы можете просто запустить Dependency Walker и выбрать: Options
=>
Configure Module Search Order...
. Затем убедитесь, что кнопка Expand
не выбрана. То, что вы видите - как бы устаревшее оно ни было - может помочь вспомнить, как работает порядок поиска модулей:
![Dependency Walker - порядок поиска модулей](https://i.stack.imgur.com/luYKS.png)
Ссылки:
02.02.2021