2012-07-27 2 views
2

Дано:Как выполнить пользовательские действия в MSI без вызова установки?

  1. Wix 3,0 используется для создания MSI.
  2. Продукт состоит из нескольких функций.
  3. Каждая функция имеет несколько дополнительных функций. Это стандартное дерево функций MSI.
  4. Каждая функция или вспомогательная функция зависят от множества внешних компонентов. . .NET 4, ASP.NET и т. Д.
  5. Пользовательское действие, написанное на C# с использованием Wix 3.0 SDK, обрабатывает эти зависимости и оценивает, присутствуют ли компоненты или нет для данного набора функций.
  6. В момент установки, если отсутствует зависимый компонент для заданного выбор функций, установка завершается с ошибкой.

Для достижения: Возможность выполнения проверки предварительных условий, которые уже сделали в MSI как пользовательские действия во время установки, без установки MSI на данной машине.

Неудачные попытки:

1) Пользовательские действия имеют сигнатуру функции, как этот

[CustomAction] 
public static ActionResult ProcessFeaturePrerequisite(Session session); 

Для того, чтобы получить объект сеанса я использовал следующие API, присутствующей в Wix 3.0 SDK

Session session = Installer.OpenPackage("Pathto\\Product.msi", true); // true doesn’t install it. Also tried with false, but didn’t work. 

Когда я вызываю вышеуказанный метод od с вышеприведенным сеансом после неудачных действий.

session.Features["SomeFeature"].CurrentState; 

Это исключение.

System.ArgumentException was unhandled by user code 
    Message=Feature ID not registered. SomeFeature 
    Source=Microsoft.Deployment.WindowsInstaller 
    StackTrace: 
     at Microsoft.Deployment.WindowsInstaller.FeatureInfo.get_CurrentState() 

Также ниже критического API, который определяет статус предварительного условия, всегда возвращает false.

session.EvaluateCondition(prereq); 

2) Я знаю способ командной строки, чтобы указать функции, выше MSI и установить его. Он идет как этого

msiexec /i "Product.msi" ADDLOCAL=ALL REMOVE="Foo,Bar " 

Я не мог найти любой API в SDK, который позволяет мне передать дополнительный Params, который возвращает объект сеанса без запуска установки. Мое предположение заключается в том, что такой парам сделает session.Features более действительным.

Вопросы: Итак, как достичь цели? Есть

  1. любой API в Wix SDK, который позволяет мне называть пользовательские действия без вызова установки?
  2. любой способ вызвать пользовательское действие из командной строки для данного MSI без установки?
  3. любой способ сделать Wix для изменения MSI в принимающей командной строке , содержащей пользовательское имя действия, которое только оценивает действие?
  4. любой лучший способ сделать то же самое?

ответ

2

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

я бы выбрал другой путь в вашей ситуации:

  1. Extract функциональности, которая на самом деле проверяет предпосылки в отдельную сборку, например, checkprereq.dll
  2. Рефакторинг вашего пользовательского действия для ссылки checkprereq.dll. Обратите внимание, что вам нужно будет добавить checkprereq.dll в таблицу Binary, а также customaction.dll. Вы должны разделить ответственность здесь: пользовательская часть действия работает с материалами MSI - в вашем случае она определяет, какие предварительные условия для проверки на основе сочетания функций, выбранных пользователем, и функциональной части - проверка фактических предпосылок, что выполняется checkprereq.dll
  3. Используйте checkprereq.dll отдельно, когда вам нужно проверить предпосылки не запуская процесс установки

попытки вы описанные здесь демонстрируют важное ложное предположение: session объекта во время установки так же, как объект установки вы просто открываете базу данных MSI для цели только для чтения. НЕПРАВДА! На самом деле, я сомневаюсь, что имеет смысл ссылаться на объект session вне транзакции установки. Как указано в его имени, это сеанс установки, то есть доступный в процессе, а не статичный.

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

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

+0

Один быстрый вопрос о последующем вопросе, я 'session.EvaluateCondition (prereq)' внутри текущего пользовательского действия. С точки зрения базы данных MSI эти карты выглядят следующим образом: NETFX4 -> (AppSearch.Property, Signature) NetFx4 -> (RegLocator.Signature, Key, Name) ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ NET Framework \ NDP \ v4 \ Full, Install' Is есть ли API в DTF WiX, который оценивается выше? – Ankush

+0

Я не уверен, что понимаю ваш вопрос ... –

+0

Извините, мой плохой. Написал выше в спешке. Я изучаю этот вопрос. – Ankush

Смежные вопросы