我必须检查是否启用了某些Windows功能才能安装我的软件。
我可以检查它或使用dism命令行工具安装它。
我创建了一个自定义操作来执行此操作,但有没有办法以“WIX原生方式”执行此操作?
<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。
答案 0 :(得分:6)
David Gardiner的回答暗示了我案中的正确解决方案。无需创建自己的自定义操作。以下是如何为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=""[System64Folder]dism.exe" /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,也可以指定回滚操作。
答案 1 :(得分:2)
答案 2 :(得分:0)
我这样做的方法是创建一个调用dism.exe进程的DTF自定义操作。您得到相同的结果,并且没有启动命令提示符。
[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参数。