Запуск служб, зависящих от параллельных сборок, с помощью установщика Windows - PullRequest
1 голос
/ 04 июня 2009

Мы находимся в процессе обновления конструкции пакета MSI нашего продукта для Windows Server 2008. Основным компонентом нашей установки является приложение, которое запускается как служба Windows. Существует также приложение конфигурации, которое запускается во время установки, чтобы настроить записи реестра для использования службой.

Служба и приложение конфигурации зависят от среды выполнения Microsoft C / C ++ и MFC, которые включены в .msi в качестве модулей слияния. Сборки для среды выполнения C / C ++ и MFC фиксируются во время InstallFinalize, что, по-видимому, препятствует запуску службы с использованием механизмов, предоставляемых установщиком Windows (это правильно?) Конечно, мы видим параллельные ошибки с at хотя бы приложение конфигурации, если оно запускается до InstallFinalize.

Подход, который мы выбрали, заключается в том, чтобы запустить приложение конфигурации как пользовательское действие "commit" после InstallFinalize, и заставить это приложение запустить службу. Для этого необходимо, чтобы приложение выполнялось с повышенными привилегиями (для которого мы используем манифест, содержащий раздел trustInfo.) Это также требует, чтобы MSI-файл был настроен для запуска этого приложения без олицетворения (что иначе смешивает повышение привилегий.)

Это приемлемый подход? Насколько это может быть в будущем? Есть ли какие-нибудь ошибки, о которых нужно знать?

Похоже, что это проблема, с которой сталкиваются другие:

http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg12666.html

Существует ли официально (или неофициально) принятый способ решения таких проблем?

В качестве дополнения к этому, есть ли способ гарантировать, что приложение, запускаемое как настраиваемое действие во время процесса установки, получает фокус при запуске? Приложения, запускаемые таким образом, всегда выглядят позади установщика, и установщик сохраняет фокус, что не особенно удобно для пользователя.

Большое спасибо,

Брюс.

Ответы [ 2 ]

1 голос
/ 31 июля 2009

Вот решение, которое я использовал для решения этой проблемы при переупаковке программного обеспечения с помощью установщика Windows: средство запуска «начальной загрузки». Короче говоря, вместо использования модулей слияния для среды выполнения (которые будут фиксироваться одновременно со всеми другими установленными вами файлами), вы можете выполнить одно из следующих действий:

  1. Укажите распространяемые MSI для среды выполнения / MFC, и сначала запустите их с помощью загрузочного загрузчика setup.exe. MSI вашей программы должен, конечно, проверить, установлена ​​ли нужная вам версия, и, возможно, даже проверить, чтобы убедиться, что вы запускаете ее из своего setup.exe. (Этот метод был популяризирован InstallShield, так как им нравится выполнять конечный запуск установщика Windows.)

  2. Еще лучше: вы можете упаковать свой MSI в качестве родительского пакета, в котором установлены два (или более) встроенных MSI: сначала установите необходимые среды выполнения, а затем установите программное обеспечение в дочернем MSI. Ваш родительский пакет подтвердит, что MSI среды выполнения успешно установлен, прежде чем продолжить установку MSI (у которого есть свобода для запуска служб, поскольку предварительные условия уже есть).

Существуют и другие хитрые методы, например, пользовательское действие для ранней фиксации, но они не так надежны, как проверенные временем, которые я только что упомянул.

Надеюсь, это имеет смысл! Раньше я жил и дышал MSI, но сейчас уже не так много ...

0 голосов
/ 04 июня 2009
  1. Вы можете компилировать статическое использование MFC & C-Runtime, так что вы не будете зависеть от него.
  2. Вы можете добавить пользовательский интерфейс в настройку, это будет действовать как программа настройки, так что вам не нужно будет запускать программу настройки во время установки (что, кстати, не очень хорошая идея)
  3. Вы можете установить службу в режиме отключения и запустить настройку после завершения установки. Конфигурация будет отвечать за активацию сервиса.
...