Настройка проекта с пользовательской формой - PullRequest
8 голосов
/ 19 февраля 2011

В настоящее время я работаю над проектом установки Visual Studio 2010 и хотел бы знать, возможно ли следующее:

1) Запустите проект установки так, чтобы формы по умолчанию не отображались,вместо этого я показываю свою собственную форму, которая подписывается на события проекта установки.Таким образом, я бы показывал сообщения об установке и увеличивал свой собственный индикатор выполнения.

2) Если 1 возможен, мне нужен способ указать местоположение по умолчанию.

3) У меня естьотдельный библиотечный проект, где у меня есть пользовательский класс установки (унаследованный от «System.Configuration.Install.Installer») из обработчика установки. Я хотел бы иметь возможность показывать пользовательские формы окон и контролировать выбор, сделанный пользователем.Я думаю, что это возможно, добавив ссылку на system.windows.forms, но будет ли это правильный путь?Если я не могу скрыть форму установки по умолчанию, эти пользовательские формы будут отображаться поверх формы установки по умолчанию, и я думаю, что она будет выглядеть слишком хорошо.

Предложения, ссылки и т. Д. Приветствуются Спасибо!

* ОБНОВЛЕНИЕ 1 *

Могу ли я запустить .msi из кода C #, но также передать значение.?

Как раз то, что этот парень делает здесь: ссылка

Но, передав значение ... затем из моего пользовательского класса установки я выполняю действия в зависимости от этого значения.

ОБНОВЛЕНИЕ 2

Похоже, я могу: ссылка код проекта

ОБНОВЛЕНИЕ 3

Я собираюсь выполнить следующее, начну тестирование с приложением winforms.

1) Запустите приложение winforms.
2) Сделайте несколько вызовов webService, отобразите данные, пользователь сделает выбор.
3) Согласно ссылке в обновлении 1, в процессе запуска (в режиме без вывода сообщений) и в каждом обновлении 2 передайте выбранные значения.
4) Используйте некоторый механизм межпроцессных событий (WCF), чтобы мой пользовательский класс установки могуведомить мою форму о различных шагах его выполнения и обновить индикатор выполнения и сообщения.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Вы можете создать пользовательских форм , но объявление должно быть сделано внутри MSI. Вы можете показать пользовательское диалоговое окно с помощью пользовательского действия, но это не сильно вам поможет, так как msi делает это:

  1. Загрузка пользовательских действий DLL
  2. Если он управляется, CLR запускается и ваш измененный код выполняется
  3. Когда пользовательское действие оставлено, dll выгружается и clr выключается

Это делается каждый раз, когда вызывается пользовательское действие. Это одна из основных причин, почему пользовательские действия обычно пишутся на C ++.

Чтобы быть более гибким, вы должны использовать WIX инструментарий, который позволяет интегрировать .NET настолько хорошо, насколько это возможно с MSI. Сама MSI ничего не знает о .NET и является собственным миром. MSI сама определяет диалоги и элементы управления внутри msi через таблицы, такие как Dialog и Control . Вы можете создать диалог и сохранить ваше состояние в свойстве msi между каждыми несколькими действиями msi, которые должны произойти, например, рассчитать дисковое пространство для выбранных функций и т. д. Но я сомневаюсь, что это решение будет эффективным, и я боюсь, что запуск и выключение CLR так часто внутри одного процесса приведут вас к ошибкам CLR, с которыми раньше никто не сталкивался.

Чтобы установить целевое местоположение, вам нужно всего лишь вызвать метод MSI MsiSetTargetPath , который вы можете очень легко PInvoke вызвать.

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

С уважением, Алоис Краус

1 голос
/ 19 февраля 2011

Насколько я знаю, проекты установки, выполненные Visual Studio, очень ограничены, если вы не используете настраиваемые действия . Эти пользовательские действия могут занять много времени для создания и отладки, поэтому может быть разумнее использовать более зрелые / функциональные инструменты, такие как Installshield

РЕДАКТИРОВАТЬ Что касается отображения окон с использованием winforms: это нормально, но: хорошая установка позволяет установку в режиме без вывода сообщений или по сценарию, убедитесь, что вы разрешаете это. Еще одна вещь, на которую следует обратить внимание - это машины, на которых нет .NET, и, следовательно, они не могут отображать формы ... ИМХО, что нет-нет, если вы не уверены, что .NET (правильная версия) присутствует.

РЕДАКТИРОВАТЬ 2 В ответ на некоторые комментарии: Существуют некоторые сценарии, которые не могут быть реализованы с помощью проектов установки и развертывания VISUAL STUDIO. Я не говорю, что установщик Windows плох. Например, попробуйте сделать собственный установщик, чтобы решить, где будет установлено приложение, и пропустить стандартное окно, которое генерирует проект. Я не говорю, что пользовательские действия ограничены, но они ИМХО тоже нелегкие.

Кроме того, когда вы хотите использовать пользовательские формы WinForms вместо форм установщика, вы должны убедиться, что начальная загрузка .NET Framework выполнена ДО того, как отобразятся какие-либо окна (WinForm). Это может быть возможно, но если вы хотите такую ​​настройку, вам лучше использовать более гибкий инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...