MSI регистрация DLL - Самостоятельная регистрация считается вредной

У меня есть WinNET-приложение.NET, которое требует регистрации родной библиотеки DLL во время установки. Мой вопрос, как я могу зарегистрировать DLL (regsvr32 ABC.dll) как часть процесса установки MSI? Похоже, как я могу отменить регистрацию DLL как часть процесса удаления?

4 ответа

Решение

vsdrfCOMSelfReg не является лучшей практикой. Попробуйте вместо этого vsdrfCOM. Это "извлечет" (или попытается, vdproj иногда POS) метаданные COM из DLL и запишет их в правильные таблицы COM. Это лучше, чем надеяться, что внешний вызов DllRegisterServer будет работать во время установки.

Теперь, когда MSI изначально знает о ваших ресурсах COM, он будет выполнять установку и удаление для вас.

Самостоятельная регистрация считается вредной

Правильный способ регистрации 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 сейчас не в продаже) для этого есть автоматизированные решения.

В Installshield вы просто активируете флаг компонента, называемый " Извлечение COM-данных при сборке ", и мудрый имеет аналогичный флаг на уровне компонентов. WiX может извлечь данные реестра COM, используя инструмент heat.exe, и сгенерированный WiX-код может быть вставлен в исходный файл WiX (могут появиться новые возможности для этого, о которых я не знаю). Мне не известны какие-либо функции в Visual Studio, которые будут автоматически извлекать COM-данные, но похоже, что Крис Пейнтер предоставляет такую ​​возможность в своем ответе.

Проверьте RegSpy2, если Heat не работает для вас (Фил Уилсон - автор "Полного руководства по установке Windows" написал RegSpy, а кто-то расширил его до RegSpy2). Также проверьте это: Зарегистрируйте ActiveX exe-сервер с помощью WiX (мой ответ внизу для использования командной строки regspy.exe).

Ошибочные данные COM, вставленные в MSI - особенно для переупакованных приложений в корпоративных средах - являются одной из основных причин " неожиданного циклического самовосстановления ". Пожалуйста, посмотрите эту длинную статью для объяснения этой проблемы: Как я могу определить, что вызывает повторное самостоятельное восстановление установщика Windows? (пункт 3 в разделе "Некоторые типичные сценарии проблемы самовосстановления" описывает эту проблему).

Существует несколько других инструментов установки с похожими функциями извлечения: Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д.

Прокрутите вниз до Правила 19 в Дао Установщика Windows здесь, чтобы увидеть, что команда MSI сказала:

http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/12/595950.aspx

Выберите файл, который хотите зарегистрировать, и в окне "Свойства" установите в поле "Регистрация" значение vsdrfCOMSelfReg. Это создаст запись в таблице SelfReg, которая автоматически зарегистрирует / отменит регистрацию вашей DLL.

http://msdn.microsoft.com/en-us/library/aa371608(VS.85).aspx

Другие вопросы по тегам