Wix引导程序-更新/安装Visual FoxPro数据库的最佳方式
本文关键字:数据库 FoxPro 最佳 方式 Visual 安装 引导程序 更新 Wix | 更新日期: 2023-09-27 17:59:01
如前所述,wix bootstrapper从customaction更新ui xaml,我使用一个Bootstrapper
安装两个MSI-packages
。
在安装过程中,我想安装/更新Visual FoxPro database
(由空闲表组成)。
目前,我通过在BootstrapperApplication
的ApplyComplete
-事件期间调用Visual FoxPro-exe
来实现这一点。为了在BootstrapperApplication
和Visual FoxPro-exe
之间建立通信,我使用MSMQ
:
private void OnApplyComplete(object sender, ApplyCompleteEventArgs e)
{
string updateFile = this.installationFolder + "''updfile.exe";
if (!MessageQueue.Exists(NAMEDPVDATENBANKNACHRICHTENSCHLANGE))
{
this._msmq = MessageQueue.Create(UPDATEMSMQ);
}
else
{
this._msmq = new MessageQueue(UPDATEMSMQ);
}
this._msmq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl);
this._msmq.Purge();
if (System.IO.File.Exists(updateFile))
{
this._dbUpdate = true;
ProcessStartInfo updateProcessInfo = new ProcessStartInfo();
updateProcessInfo.FileName = updateFile;
updateProcessInfo.Arguments = UPDATEMSMQ;
updateProcessInfo.UseShellExecute = true;
updateProcessInfo.WorkingDirectory = this.installationFolder;
updateProcessInfo.CreateNoWindow = true;
Process updateProcess = new Process();
updateProcess.StartInfo = updateProcessInfo;
updateProcess.EnableRaisingEvents = true;
updateProcess.Exited += new EventHandler(this.updateFinished);
updateProcess .Start();
while (this._dbUpdate)
{
Message msg = null;
try
{
nachricht = this._msmq.Receive(new TimeSpan(0, 0, 45));
}
catch (MessageQueueException msgEx)
{
if (nachrichtAusnahme.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
{
this.Engine.Log(LogLevel.Verbose, msgEx);
}
}
if (msg != null)
{
msg.Formatter = new ActiveXMessageFormatter();
this.Engine.Log(LogLevel.Verbose, "VfpUpdate - " + msg.Body.ToString());
}
}
}
this._msmq.Close();
MessageQueue.Delete(UPDATEMSMQ);
}
private void updateFinished(object sender, EventArgs e)
{
this._dbUpdate = false;
this.Engine.Log(LogLevel.Verbose, "Update finished");
}
这样,除非在Visual FoxPro
数据库的更新过程中出现错误,否则它就像一个魅力。应该可以回滚安装过程中所做的更改。对我来说,创建Visual FoxPro文件的备份并在发生错误时恢复文件是没有问题的。但是,我应该如何处理由实际Bootstrapper
更改的文件呢?
对于CustomAction
,我可以使用ActionResult.Failure
或ActionResult.Success
。但是使用CustomAction
,我面临以下问题:
- 无法访问
Application.Current
(用于从具有我在Bootstrapper
中使用的本地化字符串的自定义ResourceDictionary
中读取值) - MSMQ队列在传递第一条消息后断开(关闭?!)
- 在CCD_ 19中显示当前执行的任务
关于如何在BootstrapperApplication
中执行Visual FoxPro
数据库更新的任何建议都非常受欢迎。
在安装引导程序的上下文中,我不知道这一点。OTOH,VFP数据库和表或VFP表(免费)只是从文件夹中复制/移动的普通文件。你不需要有一个exe来编程创建它们。
此外,将这些文件作为设置的一部分可能也不是一个好主意。如果一些文件因为版本更改而被删除,那么安装程序可能会开始抱怨。
查看引导程序代码,我怀疑您正在安装文件夹或其子文件夹中创建这些空闲表,这将是一个真正的PITA。因为安装文件夹通常位于"程序文件(x86)"下,这是一个只读位置。
您的引导程序代码是C#。您也可以使用C#来创建这些表。一种方法是使用VFPOLEDB和ExecScript()调用。