03 November, 2010

О культуре работы с реестром

Хотел озвучить одну вещь, которая меня крайне раздражает в некоторых программах, а именно нежелание за собой чистить реестр после деинсталляции и после окончания работы. На днях очень тесно столкнулся с этим. У пользователей наш dotTrace переставал нормально работать сразу после использования сторонних профайлеров (однозначно это было замечено за YourKit и ANTS от RedGate).


Так в чем же было дело? Оказалось, что данные программы после профиляции оставляют в нескольких местах реестра ключи отвечающие за старт профайлера, а именно COR_PROFILER, COR_ENABLE_PROFILING. Что во первых заставляет CLR искать соответствующий COM объект при каждом старте программы даже если самого объекта уже давно нету в системе, а во вторых мешает работе другим программам. Все дело в том что есть некий порядок на основании которого происходит выборка каждой конкретной переменной в окружении:

  • HKLM\Software\Microsoft\.NETFramework (32-bit or 64-bit)
  • HKLM\System\CurrentControlSet\Control\Session Manager\Environment (глобальные переменные окружения)
  • HKCU\Environment (переменные окружения текущего пользователя)
  • HKLM\System\CurrentControlSet\Services\your_service [Environment] (в случае старта .NET сервиса)
Если одна и таже переменная определена в нескольких ключах реестра, то берется та которая в списке позже. Так вот, как культурные люди мы всегда использовали только самую первую строчку в списке и соответственно страдали от раздолбайства других. Но времена меняются и теперь мы используем агресивную политику относительно всех вышеперечисленных веток реестра. Теперь у нас проблем нет...

No comments: