Если вы пользуетесь бизнес-логикой или элементами управления, разработанными на VB 6 или с использованием ATL, то вы пользуетесь COM. До появления .Net Framework, COM являлся основным стандартом разработки компонент-ориентированных приложений. Однако, развёртывание приложений, содержащих COM компоненты — задача не самая тривиальная, т.к. требует масштабной регистрации в системном реестре. К сожалению, подобные манипуляции, выполненные не достаточно аккуратно, могут привести к появлению нежелательных побочных эффектов — так называемому “DLL hell”.
В .Net подобной проблемы не существует, т.к. сборки либо не требуют регистрации, либо регистрируются в GAC. Существуют различные мастера, помогающие мигрировать код в среду .Net, но их использование не всегда практично. К тому же существует хорошее правило: «Работает? Не трогай!». Разве не здорово было бы иметь способ развернуть однажды написанную COM компоненту, используя модель схожую с моделью развёртывания .Net сборок? Оказывается, начиная с Win XP есть такой способ!
Начиная с Win XP, в windows доступна новая, не требующая регистрации, модель активации COM компонентов – Reg-Free COM. В двух словах, она просто заменяет COM компонентам реестр, отображая всю стандартную информацию, необходимую для регистрации в реестре, в файл, который можно хранить в папке приложения.
Регистрация компоненты в реестре позволяет разделять один компонент между разными приложениями. Так же есть возможность зарегистрировать компоненту особым образом, позволяющим устанавливать и использовать её удалённо на другой машине в сети. Если приложение не собирается использовать эти возможности, тогда от подобной регистрации будет больше мороки, чем пользы.
От обычной регистрации COM компонент, Reg-Free COM отличается отсутствием необходимости описывать компоненту в системном реестре, что избавляет от проблем, связанных с установкой, удалением и обновлением (что особенно касается разделяемых компонент). Описание компоненты остаётся в области видимости самого приложения. Это достигается путём сохранения всей информации в XML манифесте – просто ещё одном файле в папке приложения. Во время активации компоненты система сначала проверяет наличие манифеста, и если не находит его, то выполняет поиск регистрационных данных в реестре.
Наличие файла манифеста (например, calc.exe.manifest) в папке приложения это необходимое и достаточное условие для работы Reg-Free COM модели. Если система находит один или несколько манифестов, то она строит на их основании внутреннюю таблицу соответствий идентификаторов CLSID файлам компонент. Это происходит в самом начале работы вызова CreateProcess перед запуском кода приложения. Позже, при попытке получить экземпляр компоненты, CoCreateInstance сначала анализирует внутреннюю таблицу и лишь затем системный реестр. Если все компоненты описаны в манифесте(ах), регистрация в реестре не нужна!
Начиная с Visual Studio 2005, воспользоваться всеми радостями Reg-Free COM можно включив всего одну опцию в свойствах ссылки на COM-компоненту. Она называется Isolated и выставлена в false по умолчанию. Важное замечание: не смотря на то, что манифест генерируется автоматически, на машине разработчика компонента по-прежнему должна быть зарегистрирована в реестре.
В .Net подобной проблемы не существует, т.к. сборки либо не требуют регистрации, либо регистрируются в GAC. Существуют различные мастера, помогающие мигрировать код в среду .Net, но их использование не всегда практично. К тому же существует хорошее правило: «Работает? Не трогай!». Разве не здорово было бы иметь способ развернуть однажды написанную COM компоненту, используя модель схожую с моделью развёртывания .Net сборок? Оказывается, начиная с Win XP есть такой способ!
Начиная с Win XP, в windows доступна новая, не требующая регистрации, модель активации COM компонентов – Reg-Free COM. В двух словах, она просто заменяет COM компонентам реестр, отображая всю стандартную информацию, необходимую для регистрации в реестре, в файл, который можно хранить в папке приложения.
Reg-Free COM
Регистрация компоненты в реестре позволяет разделять один компонент между разными приложениями. Так же есть возможность зарегистрировать компоненту особым образом, позволяющим устанавливать и использовать её удалённо на другой машине в сети. Если приложение не собирается использовать эти возможности, тогда от подобной регистрации будет больше мороки, чем пользы.
От обычной регистрации COM компонент, Reg-Free COM отличается отсутствием необходимости описывать компоненту в системном реестре, что избавляет от проблем, связанных с установкой, удалением и обновлением (что особенно касается разделяемых компонент). Описание компоненты остаётся в области видимости самого приложения. Это достигается путём сохранения всей информации в XML манифесте – просто ещё одном файле в папке приложения. Во время активации компоненты система сначала проверяет наличие манифеста, и если не находит его, то выполняет поиск регистрационных данных в реестре.
Наличие файла манифеста (например, calc.exe.manifest) в папке приложения это необходимое и достаточное условие для работы Reg-Free COM модели. Если система находит один или несколько манифестов, то она строит на их основании внутреннюю таблицу соответствий идентификаторов CLSID файлам компонент. Это происходит в самом начале работы вызова CreateProcess перед запуском кода приложения. Позже, при попытке получить экземпляр компоненты, CoCreateInstance сначала анализирует внутреннюю таблицу и лишь затем системный реестр. Если все компоненты описаны в манифесте(ах), регистрация в реестре не нужна!
Как?
Начиная с Visual Studio 2005, воспользоваться всеми радостями Reg-Free COM можно включив всего одну опцию в свойствах ссылки на COM-компоненту. Она называется Isolated и выставлена в false по умолчанию. Важное замечание: не смотря на то, что манифест генерируется автоматически, на машине разработчика компонента по-прежнему должна быть зарегистрирована в реестре.