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

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

Ответы [ 4 ]

12 голосов
/ 26 мая 2011

Хороший ответ от Криса Пейнтера, добавив для справки: как правильно зарегистрировать 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 и т. Д.

4 голосов
/ 26 мая 2011

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

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

1 голос
/ 28 апреля 2015

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

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

0 голосов
/ 26 мая 2011

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

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

...