среда, 11 ноября 2015 г.

Выбираемся из DLL Hell

Это перевод Getting Out of DLL Hell. Автор: Реймонд Чен.

DLL HELL. Проблема настолько коварна, что она имеет своё собственное негативное прозвище. Вы устанавливаете одну программу, и вдруг какая-то другая, казалось бы, не связанная программа перестаёт работать. Это потому, что, хотя вам это неизвестно, но две программы связаны через общий файл DLL. Эти две программы могут иметь различные идеи о том, какую версию файла MSVCRT.DLL нужно хранить в системном каталоге. Или первая программа может обновить элемент управления ActiveX, который также использует вторая программа - сделать обновление, с которым вторая программа не полностью совместима.

Если обе программы имеют важное значение для повседневных операций вашей компании, то для вас, на самом деле, не имеет значения, какая программа виновата. Важно то, что вам нужно заставить работать их обе. Существует не так много различий между "Мы теряем деньги" и "Мы теряем деньги из-за Боба". В любом случае ваша компания теряет деньги - и это ваша работа, решить эту проблему сразу.

Когда-то давно вам приходилось выбирать какая программа "выиграла", а какая - "проиграла". Но сейчас (начиная с Windows 2000) вам доступны способы разрешения таких конфликтов. Эти способы, однако, являются лишь временными решениями, чтобы вернуть вашу систему в рабочее состояние, пока вы/разработчики программ исследуете более постоянное решение конфликта.

В Windows 2000 реализована минимальная версия технологии, поставляемой сейчас под модным названием Dynamic-Link Library Redirection (перенаправление библиотек динамической компоновки). Чтобы включить перенаправление библиотеки DLL, создайте файл с тем же именем, что и файл программы, для библиотек DLL которой требуется перенаправление, но добавив .local к имени файла. Например, чтобы использовать перенаправление для программы C:\Program Files\Litware Inc\Invoice.exe следует создать файл C:\Program Files\Litware Inc\Invoice.exe.local. Содержимое файла не имеет значения; важен сам факт существования этого файла.

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

Волшебство этого метода заключается ещё и в том, что он работает даже тогда, когда программа использует полный путь для загрузки библиотеки DLL. Например, представим себе, что программа пытается загрузить библиотеку C:\Program Files\Common Files\Proseware Inc\taxplugin.dll. После обновления до версии Proseware 2.0 вы обнаруживаете, что подключаемые модули расчета налогов несовместимы с программой подготовки счетов. Вы можете скопировать старую версию подключаемого модуля расчета налогов в C:\Program Files\Litware Inc\taxplugin.dll. Даже несмотря на то, что при загрузке подключаемого модуля расчета налогов используется полный путь, перенаправление библиотек DLL сначала выполнит поиск в текущей папке и будет использовать локальную копию вместо копии в папке «Proseware Inc».

В операционных системах Windows XP и выше правила перенаправления библиотек DLL немного отличаются, но общий принцип остается тем же. Кроме создания файла с расширением «local» можно создать и папку с таким расширением. В этом случае поиск будет выполняться в папке с расширением «local», а не в папке установки программы. Это позволяет использовать перенаправление для нескольких программ в одной папке, не создавая конфликтов. К примеру, если у программы из примера выше существует папка C:\Program Files\Litware Inc\Invoice.exe.local, то будет загружена DLL C:\Program Files\Litware Inc\Invoice.exe.local\taxplugin.dll.

Осталось только заметить что .local файлы и папки игнорируются, если приложение использует манифесты для управления зависимостями.

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

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.