2013-02-19 3 views
2

Я написал управляемый загрузчик wix, используя WPF. Фактические этапы установки требуют цепочки нескольких файлов msi/exe и пакетных файлов.wix bootstrapper

<Chain> 
<MsiPackage SourceFile="xxx"/> 
<ExePackage Id="Test" SourceFile="..\TestBatch.bat" Vital="yes"/> 
<MsiPackage SourceFile="yyy"/> 
</Chain> 

Во время выполнения каждого пакета, сообщение должно быть отображено (предпочтительно от загрузчика UI), который указывает на MSI/EXE пакет/пакетный файл выполняется в данный момент. Короче говоря, необходим ProgressText в загрузчике. Как я могу это сделать?

Другой вопрос: я не хочу, чтобы все msi были упакованы в загрузочный exe. Это связано с тем, что: каждый раз, когда изменился msi, мы хотели бы отправить только обновленные/измененные msi, а не весь загрузочный exe. Есть ли способ сделать это?

ответ

5

Два ответа, один совет:

  1. Чтобы получить сообщения обратно в течение MsiPackages устанавливается, обрабатывать BootstrapperCore.ExecuteMsiMessage событие. Событие args там будет содержать сообщение, которое содержит данные, которые вы ищете.

  2. Чтобы настроить сжатие пакетов или нет, используйте атрибут Compress. Вы можете либо пометить весь Bundle/@Compress='no', либо пометить каждый пакет Compress='no' (или 'yes', если вы хотите пойти таким образом).

-

Предложение: Не забудьте добавить DetectCondition к ExePackages так Ожог будет знать, если ExePackages уже присутствуют или нет.

+0

Спасибо, Роб. Оба вышеуказанных предложения очень хорошо служат моей цели. Я хотел бы знать, возможно ли передать сообщение из моего ExecPackage обратно в загрузчик? Ситуация такова: у меня есть несколько командных файлов, которые нужно выполнить, и я делаю это с помощью ExecPackage. Основываясь на некоторых результатах в пакете, я хотел бы отобразить соответствующее сообщение пользователю и представить варианты продолжения/прерывания/перезапуска и т. Д. – microsoftprogrammer

+0

В продолжение моих комментариев выше ... Я думаю, что, возможно, для сохранения сообщения как записи реестра и получения его в событии ExecutePackageComplete. Есть ли другой способ сделать это? – microsoftprogrammer

+3

Ваш исполняемый файл может реализовать «встроенный протокол записи» для отправки сообщений о достигнутых успехах и сообщениях об ошибках. Это совсем не документировано, поэтому вам нужно будет пройти через код Burn, чтобы увидеть протокол, но он есть и вы получите именно то, что вы хотите. Может оказаться полезным и «bundlerunner» .csproj в исходном коде WiX. –

0
private void ExecuteMsiMessage(object sender, ExecuteMsiMessageEventArgs e) 
{ 
    lock (this) 
    { 
     switch (e.MessageType) 
     { 
      case InstallMessage.ActionStart: 
      { 
       string[] entireMessage = e.Message.Split(':'); 
       string[] actionMessage = entireMessage[3].Split('.'); 

       if (actionMessage[1].Trim() != "") 
       { 
        PackageMessage = actionMessage[1]; 
       } 
       break; 
      } 
     } 

     e.Result = MainWindowViewModel.Canceled ? Result.Cancel : Result.Ok; 
    } 
} 
+1

Добро пожаловать в stackoverflow. Я вижу 2 вопроса с этим ответом: 1) код не сформирован должным образом и 2) этот ответ - только код. 1. Пожалуйста, см. Здесь [как форматировать код] (https://stackoverflow.com/editing-help) 2. Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшается его долгосрочная ценность. –

+0

Я отредактировал сообщение, чтобы улучшить форматирование. Пожалуйста, добавьте контекст к вашему ответу. – Tom

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