Хороший ответ от Криса Пейнтера, добавив для справки: как правильно зарегистрировать DLL в wix 3.9
Самостоятельная регистрация считается вредной
Правильный способ регистрации файла COM состоит в извлечении информации реестра COM из файла и добавлении в соответствующее семейство таблиц COM в MSI. Большинство инструментов MSI имеют функции для поддержки этого извлечения COM. подробности см. в отдельном разделе в конце ответа.
В этой статье MSI SDK перечислены несколько вариантов общих проблем с самостоятельной регистрацией, описанных ниже, а также описаны некоторые дополнительные подробности, особенно в отношении регистрации COM для каждого пользователя. данные и сценарии запуска из источника.
Извлеченные COM-данные обеспечат надежную установку вашего COM-сервера, а также поддержку расширенных функций MSI , таких как " реклама ", " откат ", отказоустойчивость и " повышенные привилегии ". Вы можете прочитать больше об этих расширенных преимуществах MSI в этом резюме, которое стало несколько популярным на serverfault.com: корпоративные преимущества MSI .
Также можно использовать встроенную таблицу SelfReg в установщике Windows, чтобы зарегистрировать файл, используя regsvr32.exe как часть процесса установки (или даже вызывая его как пользовательские действия), но это считается плохой практикой по ряду причин:
- Откат : Установщик Windows не может правильно обработать откат, если данные COM не извлечены и не встроены в MSI. Результатом является то, что неудачная установка не может правильно очистить свою зону обслуживания COM, и MSI не вернет аппарат в исходное состояние должным образом. Откат COM-данных действительно работает как «автоматическое отслеживание» отслеживания каждого изменения в реестре, будь то добавление, изменение или удаление, и является надежным, если все сделано правильно.
- Безопасность : Процесс самостоятельной регистрации COM-сервера может в некоторых случаях выполнять неортодоксальные задачи, такие как изменение сетевых настроек системы или выполнять другие сумасшедшие маневры , которые не имеют ничего общего с COM и трудно идентифицировать и отладить. Я лично видел, в недоумении, я мог бы добавить, что регистрация COM изменяет сетевые настройки системы без какого-либо предупреждения и без видимой причины. Это могло бы быть просто оптимизацией для приложения, но это редко бывает приемлемо, когда оно изменяет всю систему, затрагивая все остальное программное обеспечение. Хотя EXE-файл, запущенный в режиме администратора, может делать то же самое и быть одинаково неисправным, саморегистрация может оказаться незаметной и менее очевидной в качестве проблемы безопасности. Это основная причина, по которой крупные корпорации и лучшие практики Microsoft настаивают на том, чтобы запретить самостоятельную регистрацию, поскольку это может помешать критически важным для бизнеса системам.
- Связанные зависимости : для успешной регистрации некоторые COM-файлы должны быть зарегистрированы в определенном порядке в системе. Другими словами, файл B не может быть зарегистрирован, пока файл A не будет зарегистрирован. Честно говоря, я никогда не видел этого в реальной жизни, но это технически возможно, и я видел зависимости от языковых библиотек ( ресурсов только библиотек ), вызывающих сбой извлечения COM. Хотя это немного отличается, это все еще проблема зависимости. MSI не позволяет указывать порядок регистрации (вероятно, из-за происхождения базы данных MSI, строки неупорядочены). Если вы правильно извлечете данные реестра на компьютере сборки и поместите их в MSI, эти связанные цепочки не вызовут ошибку приложения.
- Проблемы с правами доступа : Установщик Windows имеет расширенные функции для повышения уровня привилегий пользователя, устанавливающего MSI, чтобы разрешить регистрацию всей информации без проблем с разрешениями ( без проблем) о с временными правами администратора ). Если вы используете таблицу SelfReg , вы, скорее всего, столкнетесь с проблемами регистрации, вызванными особенностями разрешений или привилегий в локальной системе (по моему опыту это особенно очевидно для операций самовосстановления ). Подобные проблемы с разрешениями возникают все больше и больше, поскольку новые версии Windows постоянно создают новые препятствия для успешного развертывания программного обеспечения (запросы UAC, блокировка самовосстановления, изменения олицетворения и т. Д.).
- Устойчивость : Если другое приложение уничтожает записи реестра COM, COM-данные, встроенные в ваш MSI, переустанавливают компонент COM со всеми связанными записями реестра посредством самовосстановления, если для извлечения используется правильное извлечение COM. пакет. Это означает, что ваше приложение всегда должно запускаться с должным образом зарегистрированными COM-серверами. Однако это также может вызвать страшную повторяющуюся последовательность циклов самовосстановления , которую видели многие опытные пользователи компьютеров ( здесь более простое и короткое объяснение ). Другими словами, извлечение COM также может быть пронизано проблемами, но простое использование саморегистрации может привести к поломке вашего приложения, а также склонности к ошибкам безопасности, возникающим при выполнении восстановления, изменения или самовосстановления ваш продукт (операция самостоятельной регистрации может выполняться без повышенных прав и, следовательно, не может быть завершена, если восстановление выполняется с правами пользователя с ограниченными правами). Это означает, что ошибки невозможно исправить для большинства обычных пользователей. Это все, что они умеют делать, если продукт не работает.
- Реклама : Рекламируемые продукты доступны пользователю с помощью ярлыков и записей реестра, но в настоящее время не установлены на компьютере. Установка «по требованию» может быть вызвана несколькими способами - называемыми объявленными точками входа (рекомендуется статья Symantec) , одним из которых является вызов объявленного COM-сервера , Установка не будет инициирована, если файл не будет должным образом объявлен в реестре, и, следовательно, отсутствует критический триггер «самостоятельного восстановления», если вы используете саморегистрацию.
Установочный инструмент Поддержка регистрации COM
Извлечение COM-данных и ввод в таблицы MSI является довольно сложной задачей , и большинство инструментов на рынке, таких как Installshield , Advanced Installer , и Wise (К сожалению, Wise сейчас не в продаже) имеют автоматизированные решения для этого.
В Installshield вы просто активируете флаг компонента с именем " Извлечение COM-данных при сборке ", а Wise имеет аналогичный флаг на уровне компонентов. WiX может извлекать данные реестра COM с помощью инструмента heat.exe , и сгенерированный WiX-код может быть вставлен в исходный файл WiX (к этому моменту могут появиться новые функции) что я не в курсе). Мне не известны какие-либо функции в Visual Studio , которые будут автоматически извлекать COM-данные, но похоже, что Крис Пейнтер предоставляет такую возможность в своем ответе.
Проверьте RegSpy2 , если Heat не работает для вас ( Фил Уилсон - автор "Полного руководства для установщика Windows" написал RegSpy и кто-то расширил его до RegSpy2 ). Также проверьте это: Зарегистрируйте exe-сервер ActiveX с помощью WiX (мой ответ к основанию для использования командной строки regspy.exe).
Ошибочные COM-данные, вставленные в MSI - особенно для переупакованных приложений в корпоративных средах - являются одной из основных причин " неожиданного циклического самовосстановления ".Пожалуйста, прочтите эту длинную статью для объяснения этой проблемы: Как определить причину повторного самовосстановления установщика Windows? (пункт 3 в разделе «Некоторые типичные сценарии проблем самовосстановления» описывает эту проблему).
Несколько других инструментов установки существуют с похожими функциями извлечения: Какой установочный продукт использовать?InstallShield, WiX, Wise, Advanced Installer и т. Д.