Wix引导程序-更新/安装Visual FoxPro数据库的最佳方式

本文关键字:数据库 FoxPro 最佳 方式 Visual 安装 引导程序 更新 Wix | 更新日期: 2023-09-27 17:59:01

如前所述,wix bootstrapper从customaction更新ui xaml,我使用一个Bootstrapper安装两个MSI-packages

在安装过程中,我想安装/更新Visual FoxPro database(由空闲表组成)。

目前,我通过在BootstrapperApplicationApplyComplete-事件期间调用Visual FoxPro-exe来实现这一点。为了在BootstrapperApplicationVisual 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.FailureActionResult.Success。但是使用CustomAction,我面临以下问题:

  • 无法访问Application.Current(用于从具有我在Bootstrapper中使用的本地化字符串的自定义ResourceDictionary中读取值)
  • MSMQ队列在传递第一条消息后断开(关闭?!)
  • 在CCD_ 19中显示当前执行的任务

关于如何在BootstrapperApplication中执行Visual FoxPro数据库更新的任何建议都非常受欢迎。

Wix引导程序-更新/安装Visual FoxPro数据库的最佳方式

在安装引导程序的上下文中,我不知道这一点。OTOH,VFP数据库和表或VFP表(免费)只是从文件夹中复制/移动的普通文件。你不需要有一个exe来编程创建它们。

此外,将这些文件作为设置的一部分可能也不是一个好主意。如果一些文件因为版本更改而被删除,那么安装程序可能会开始抱怨。

查看引导程序代码,我怀疑您正在安装文件夹或其子文件夹中创建这些空闲表,这将是一个真正的PITA。因为安装文件夹通常位于"程序文件(x86)"下,这是一个只读位置。

您的引导程序代码是C#。您也可以使用C#来创建这些表。一种方法是使用VFPOLEDB和ExecScript()调用。