如何在WiX中读取自定义操作的可执行输出?

时间:2012-08-23 13:15:02

标签: wix windows-installer wix3.5 custom-action

我在WiX中制作MSI安装程序。在安装过程中,我想从custom action运行一个可执行文件并获取其标准输出(而不是返回代码)以供以后在安装期间使用(假设有Property元素)。

如何在WiX(3.5)中实现?

2 个答案:

答案 0 :(得分:3)

我将此代码用于类似的任务(它是一个C#DTF自定义操作):

// your process data
ProcessStartInfo processInfo = new ProcessStartInfo() {
   CreateNoWindow = true,
   LoadUserProfile = true,
   UseShellExecute = false,
   RedirectStandardOutput = true,
   StandardOutputEncoding = Encoding.UTF8,
   ...
};

Process process = new Process();
process.StartInfo = processInfo;
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
  {
     if (!string.IsNullOrEmpty(e.Data) && session != null)
     {
         // HERE GOES THE TRICK!
         Record record = new Record(1);
         record.SetString(1, e.Data);
         session.Message(InstallMessage.ActionData, record);
      }
  };

process.Start();
process.BeginOutputReadLine();
process.WaitForExit();

if (process.ExitCode != 0) {
   throw new Exception("Execution failed (" + processInfo.FileName + " " + processInfo.Arguments + "). Code: " + process.ExitCode);
}

process.Close();

答案 1 :(得分:3)

这称为“屏幕抓取”,虽然技术上可以创建基础架构来运行EXE流程,刮掉它的输出然后将数据封送回MSI上下文,但它永远不会是一个强大的解决方案。

更好的解决方案是了解EXE的作用以及它是如何做到的。然后编写一个C#o C ++自定义操作,该操作在进程中运行,可以访问MSI句柄,以便您可以完成工作并设置需要设置的属性。