2013-08-08 3 views
4

Я должен проверить, включены ли некоторые функции Windows, чтобы установить мое программное обеспечение.WIX включить функцию Windows

Я могу проверить его или установить с помощью инструмента командной строки dis.

Я создаю пользовательское действие, чтобы сделать это, но есть ли способ сделать это в «WIX native»?

<Property Id="dism" Value="dism.exe" /> 
<CustomAction Id="InstallMSMQContainer" Property="dism" ExeCommand=" /online /enable-feature /featurename:MSMQ-Container /featurename:MSMQ-Server /featurename:MSMQ-ADIntegration" Return="check" Impersonate="yes" Execute="oncePerProcess"/> 

<InstallUISequence> 
    <Custom Action="InstallMSMQContainer" After="CostFinalize" Overridable="yes">NOT Installed</Custom> 
</InstallUISequence> 

Проблема в том, что команда запускает командную строку, которая очень уродлива для конечного пользователя. Как я могу сделать это лучше? Я не знаю, нужен ли мне bootstraper для этого (например, установка .NET Framework).

Есть ли какое-либо расширение для управления этими вещами?

Я сейчас использую WIX 3.7.

+1

Взгляните на тихое исполнение пользовательского действия: http://wix.sourceforge.net/manual-wix3/qtexec.htm –

+0

@YanSklyarenko просто заметил ваш комментарий после отправки ответа с помощью той же ссылки! –

ответ

0

Как я это делаю, создавая настраиваемое действие DTF, которое вызывает процесс dism.exe. Вы получаете тот же результат, и никакая командная строка не запускается.

[CustomAction] 
public static ActionResult RunDism(Session session) 
{ 
    session.Log("Begin RunDism"); 
    string arguments = session["CustomActionData"]; 

    try 
    { 
     ProcessStartInfo info = new ProcessStartInfo(); 
     info.FileName = "dism.exe"; 
     session.Log("DEBUG: Trying to run {0}", info.FileName); 
     info.Arguments = arguments; 
     session.Log("DEBUG: Passing the following parameters: {0}", info.Arguments); 
     info.UseShellExecute = false; 
     info.RedirectStandardOutput = true; 
     info.CreateNoWindow = true; 

     Process deployProcess = new Process(); 
     deployProcess.StartInfo = info; 

     deployProcess.Start(); 
     StreamReader outputReader = deployProcess.StandardOutput; 
     deployProcess.WaitForExit(); 
     if (deployProcess.HasExited) 
     { 
      string output = outputReader.ReadToEnd(); 
      session.Log(output); 
     } 
     if (deployProcess.ExitCode != 0) 
     { 
      session.Log("ERROR: Exit code is {0}", deployProcess.ExitCode); 
      return ActionResult.Failure; 
     } 
    } 
    catch (Exception ex) 
    { 
     session.Log("ERROR: An error occurred when trying to start the process."); 
     session.Log(ex.ToString()); 
     return ActionResult.Failure; 
    } 
    return ActionResult.Success; 
} 

Параметры DISM устанавливаются с помощью пользовательских данных действий.

6

Дэвид Гардинер намекнул на правильное решение в моем случае. Создание собственного пользовательского действия не требуется. Вот как это сделать для 64 битной установки Windows:

Сначала определите, если установлена ​​MSMQ:

<Property Id="MSMQINSTALLED"> 
    <RegistrySearch Id="MSMQVersion" Root="HKLM" Key="SOFTWARE\Microsoft\MSMQ\Parameters" Type="raw" Name="CurrentBuild" /> 
</Property> 

Объявите свои собственные действия. Вам нужно два. Один установить свойство на пути к DISM, и другой, чтобы выполнить его:

<CustomAction Id="InstallMsmq_Set" Property="InstallMsmq" Value="&quot;[System64Folder]dism.exe&quot; /online /enable-feature /featurename:msmq-server /all" Execute="immediate"/> 
<CustomAction Id="InstallMsmq" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check"/> 

Наконец указать пользовательские действия в установке последовательности:

<InstallExecuteSequence> 
    <Custom Action="InstallMsmq_Set" After="CostFinalize"/> 
    <Custom Action="InstallMsmq" After="InstallInitialize">NOT REMOVE AND NOT MSMQINSTALLED</Custom> 
</InstallExecuteSequence> 

Потому что это может занять немного времени Я добавил следующее, чтобы обновить текст состояния инсталлятора:

<UI> 
    <ProgressText Action="InstallMsmq">Installing MSMQ</ProgressText> 
</UI> 

вы также можете указать действие отката, если вы хотите удалить MSMQ при сбое установки.

+0

Для тех, кто смотрит на установку другой функции Windows, я нашел, что это полезно, и этот вопрос также: http://stackoverflow.com/questions/18992363/test-for-windows-features#answer-18997675 –

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