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

WiX Toolset: How to store a file from Binary Table in a Custom Action

我想将二进制文件 table 存储到自定义操作中的临时位置。 我有两个自定义操作,第一个是 'immediate',另一个是 'deferred'.

当我在 'immediate' 自定义操作的 运行 期间调用 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>

从 'deferred' 自定义操作我无法获得数据库视图,这是预期的。 而且,我无法将文件的二进制数据从 'immediate' 传递到 'deferred' 自定义操作,因为 System.IO.Stream class 不支持序列化。

优秀的亚历克斯。感谢您的反馈。原题的解决方法是调用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); 
    } 
}