Я работаю над приложением Windows (EXE), которое использует несколько библиотек DLL. Разработка ведется в VCExpress 2005 (VC 8.0) с использованием только C.
Некоторые из этих библиотек DLL представляют собой подключаемые модули / надстройки / расширения, которые динамически загружаются с использованием LoadLibrary
в соответствии с файлом конфигурации, считываемым EXE-файлом.
Важно: приложение должно быть переносимым (в смысле возможности запуска с флэш-накопителя USB или подобного без установки), а подключаемые библиотеки DLL могут не находиться в той же папке, что и EXE-файл приложения (устаревшие причины) .
С MSVC6 это просто: компилируйте, связывайте, распространяйте EXE и DLL.
В MSVC8 библиотека времени выполнения C (MSVCRT) больше не распространяется с ОС, поэтому нельзя полагаться на ее установку. Чтобы удовлетворить требования переносимости, мне нужно использовать частную сборку . Все EXE и DLL имеют встроенные манифесты.
Моя проблема : подключаемые библиотеки DLL, загружаемые с помощью LoadLibrary()
, не находят приватную сборку, находящуюся в папке EXE, поэтому попытка загрузить их не удалась, если сборка Microsoft.VC80.CRT
не установлена в Winsxs.
Подвох : если манифесты удалены из DLL подключаемого модуля, все работает.
Мои вопросы :
В проблемном случае Windows, похоже, не следует ни последовательности поиска Assembly , ни порядку поиска библиотеки динамических ссылок . В частности, он ищет закрытую сборку по пути, из которого была загружена DLL, а не из которого загружалось приложение (EXE).
Я попытался проверить это, поместив сборку рядом с DLL и изменив текущий каталог (чтобы исключить связанные со случаями рабочего каталога), и получил ожидаемое поведение. Кто-нибудь еще может подтвердить, что это нормальное поведение при использовании LoadLibrary
с SxS?
Прав ли я, предполагая, что без манифеста DLL возвращается к порядку загрузки не-SxS, который находит msvcr80.dll
(а не манифест сборки Microsoft.VC80.CRT.manifest
) в папке EXE?
Если я прав насчет (1) и (2), что я потеряю, просто исключив манифест из DLL? Перефразируя, почему я не должен решить мою проблему, просто исключив манифест?