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



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

在运行"即时"自定义操作期间,我调用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 类不支持序列化。

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

最新更新