WiX工具集:如何在自定义操作中存储二进制表中的文件

时间:2018-05-18 18:36:21

标签: c# wix windows-installer custom-action

我想将二进制表中的文件存储到自定义操作中的临时位置。 我有两个自定义操作,第一个是'立即',另一个是'延期'。

在运行'立即'自定义操作期间,我调用了Microsoft.Deployment.WindowsInstaller.Record.GetStream方法,它不保存文件。

[CustomAction]
public static ActionResult ImmediateAction(Session session)
{
    try
    {
        View view = db.OpenView("SELECT Name, Data FROM Binary");
        view.Execute();

        foreach (Record row in view)
        {
            row.GetStream("Data", Path.Combine(Environment.GetEnvironmentVariable("temp"), row.GetString("Name"));
        }

        return ActionResult.Success;
    }
    catch (Exception ex)
    {
        session.Log(ex.Message);
        return ActionResult.Failure;
    }
    finally
    {
        db.Close();
    }
}

“自定义操作”可以正常运行,但不会创建该文件。

更新

在InstallExecuteSequence中,自定义操作描述如下:

    <InstallExecuteSequence>
       <Custom Action="ImmediateAction"
             Before="DeferredAction">
          NOT Installed
        </Custom>

        <Custom Action="DeferredAction"
             After="InstallInitialize">
          NOT Installed
        </Custom>
   </InstallExecuteSequence>

从'延迟'自定义操作,我无法获得预期的数据库视图。 并且,我无法将文件的二进制数据从“立即”传递到“延迟”自定义操作,因为System.IO.Stream类不支持序列化。

1 个答案:

答案 0 :(得分:0)

优秀的Alex。感谢您的反馈。原始问题的解决方案是调用View()对象的Fetch()方法:https://msdn.microsoft.com/en-us/library/windows/desktop/aa372509(v=vs.85).aspx

tempFile = Path.GetTempFileName(); 
using (View binaryView = session.Database.OpenView("SELECT Name, Data FROM Binary")) 
{ 
    binaryView.Execute(); 
    using (Record binaryRec = binaryView.Fetch()) 
    { 
        binaryRec.GetStream(2, tempFile); 
    } 
}