«Кэшированное» поведение «исправленных» библиотек - PullRequest
2 голосов
/ 01 апреля 2009

Иногда клиенту (или тестеру) требуется патч для установки продукта, над которым я работаю. Иногда я завариваю ему dll, содержащую исправление, чтобы он мог проверить его. Он перезаписывает старый dll новой версией и перезапускает приложение.

Время от времени кажется, что «новая» dll на самом деле не используется, хотя я абсолютно уверен, что мои совершенно новые сверкающие байты были скопированы поверх старой dll.

Что еще хуже, после первого запуска «исправления» при перезапуске приложения новая функция явно загружена ... и старое поведение больше никогда не будет видно.

Кто-нибудь наблюдал такое поведение? Возможно ли, что загрузчик XP вроде «кэшей» недавно использовал dll?

(Примечание: это происходит в XP SP2)

1 Ответ

1 голос
/ 19 августа 2009

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

  • переименуйте dll в dll.orig
  • Копировать новую DLL
  • перезапустить приложение

может случиться так, что версия dll.orig все еще используется , если она не была полностью выгружена (потому что какое-то еще запущенное приложение все еще имеет ссылку на нее).

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

Обойти это просто: закрыть все программы, использующие эту DLL. Sysinternals Process Explorer помогает найти приложения, которые его используют.

...