Проект установки VS - установка сборок в GAC и запуск службы, которая использует их все в одной установке - PullRequest
1 голос
/ 12 апреля 2011

Я прочитал каждую статью stackoverflow по установкам MSI, но не могу найти решение моей проблемы:

У меня есть решение VS2010 с 5 проектами, все нацеленные на .NET 2.0:

  • DLL A, нет ссылок на проекты
  • DLL B, ссылки на DLL
  • A Приложение Windows Forms, ссылки на DLL B
  • Служба Windows, ссылки на DLL B
  • Проект установки

DLL A и DLL B настроены так, чтобы быть установленными в GAC во время установки.Я хотел бы запустить службу после завершения установки, но согласно тому, что я прочитал, сборки не регистрируются до самого последнего шага.Я доказал это, пытаясь запустить службу в событии AfterInstall моего класса ServiceInstaller, и я получаю следующую ошибку:

Ошибка 1001. Не удалось загрузить файл или сборку «DLL_B», версия 1.0.0.1, Культура = нейтральный, PublicKeyToken = 5e297270603814f4 'или одна из его зависимостей.Системе не удалось найти указанный файл.

Но, конечно, после завершения установки я могу вручную запустить службу, и она работает нормально.Кроме того, в Windows XP я обычно запускаю службу при запуске приложения (у меня есть флажок с Launch Application в качестве последнего шага установщика).Но в Windows 7 разрешения в это время больше не повышаются, и при запуске службы выдается ошибка.

Как выполнить установку и запуск службы без принудительной перезагрузки ?Процитирую моего клиента: «Сейчас 2011 год, и в этом не должно быть необходимости», и я искренне согласен.

Спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Это хорошо известная проблема с GAC. Одним из вариантов может быть использование двух отдельных инсталляторов и последовательное их подключение. Именно так мы решили обойти проблему развертывания сред выполнения Microsoft VC в Vista и более поздних версиях. Если вы используете модули слияния, любые сервисы, которые зависят от них, не запустятся. Таким образом, по сути вы помещаете компоненты, предназначенные для GAC, в предустановщик, транзакция которого будет завершена и зафиксирована до запуска второй установки, которая устанавливает и запускает службы, которые зависят от них. Ужасно, я знаю, но лучше, чем перезагрузка.

1 голос
/ 29 апреля 2011

Я решил эту проблему немного по-другому: я установил свои сборки не только в GAC, но и в папку приложений.Мои сборки, связанные с GAC, уже были найдены как зависимости, поэтому я поместил их в GAC (и они действительно оказываются там только после выполнения всех пользовательских шагов).Я также добавил те же сборки, что и основной вывод, в папку приложения, где также находится моя DLL-библиотека InstallHelper с пользовательскими действиями.Таким образом, во время установки используется локальная копия из папки приложений.

1 голос
/ 13 апреля 2011

Решением является использование настраиваемого действия, которое запускается после InstallFinalize в таблице InstallExecuteSequence.Это настраиваемое действие должно использовать флаги msidbCustomActionTypeAsync и msidbCustomActionTypeContinue , поэтому оно запускается в отдельном процессе после завершения установки.

Это невозможно сделать с помощью проекта установки Visual Studio, но естьмного альтернатив: Orca , WiX, инструмент для разработки коммерческих настроек и т. д.

...