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);
}
}
我想将二进制文件 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);
}
}