Wix Bootstrapper - Лучший способ обновить / установить базу данных Visual FoxPro
Как уже упоминалось, /questions/40417376/interfejs-obnovleniya-zagruzchika-wix-xaml-ot-customaction я использую Bootstrapper
установить два MSI-packages
,
Во время установки я хочу установить / обновить Visual FoxPro database
(состоящий из свободных столов).
На данный момент я достигаю этого, вызывая Visual FoxPro-exe
в течение ApplyComplete
Событие BootstrapperApplication
, Установить связь между 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
(для чтения значений из настроенногоResourceDictionary
с локализованными строками, которые я использую вBootstrapper
) - MSMQ-очередь прерывается (закрывается?!) после доставки первого сообщения
- отобразить текущее выполненное задание в
MainWindow
,
Любые советы о том, как выполнить обновление Visual FoxPro
База данных внутри BootstrapperApplication
действительно приветствуется
1 ответ
Я не знаю, что в контексте установки загрузчика. OTOH, база данных VFP и таблицы или таблицы VFP (бесплатно) - это просто простые файлы, которые копируются / перемещаются из папки. Вам не нужно иметь exe для этого, чтобы создавать их программно.
Также не рекомендуется использовать эти файлы как часть установки. Если некоторые файлы удалены из-за изменения версии, ваш установщик может начать лаять об этом.
Глядя на код загрузчика, я подозреваю, что вы создаете те свободные таблицы в папке установки или ее подпапках, которые будут настоящей PITA. Поскольку папка установки обычно находится в папке "Program Files (x86)", которая доступна только для чтения.
Ваш код загрузчика - C#. Вы также можете использовать C# для создания этих таблиц. Один из способов сделать это - использовать вызовы VFPOLEDB и ExecScript().