我想将二进制表中的文件存储到自定义操作中的临时位置。 我有两个自定义操作,第一个是'立即',另一个是'延期'。
在运行'立即'自定义操作期间,我调用了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类不支持序列化。
答案 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);
}
}