WiX 3.5.2030.0 CreateDatabase не работает с 1603 с DTF внешним обработчиком пользовательского интерфейса, работает без внешнего обработчика пользовательского интерфейса
У меня есть простой установщик WiX (3.5.2030.0) в Windows 7 (установщик Windows 5.0.7600.16385 в соответствии со свойствами msiexec.exe), который использует предоставленное пользовательское действие для создания базы данных SQL. Когда я сам запускаю MSI или запускаю его в транзакции в загрузчике установки C# (используя DTF для взаимодействия), он работает правильно.
Когда я запускаю MSI в загрузчике и подключаю внешний обработчик пользовательского интерфейса (единственное изменение кода по сравнению с рабочим - это вызов, подобный этому:
Installer.SetExternalUI(ExternalUIHandler, ilm);
), однако вызов CreateDatabase не выполняется. В журнале SQL нет ничего релевантного - он показывает, что база данных запускается. В SQL Profiler нет ничего релевантного - он показывает, что CA проверяет существование базы данных, а затем попытка удаления после создания завершается неудачей. Вот что показывает подробный журнал отладки:
MSI (s) (74:F4) [16:42:59:213]: Executing op: ActionStart(Name=CreateDatabase,Description=Creating Databases,)
MSI (s) (74:F4) [16:42:59:243]: Executing op: CustomActionSchedule(Action=CreateDatabase,ActionType=25601,Source=BinaryData,Target=**********,CustomActionData=**********)
MSI (s) (74:F4) [16:42:59:253]: Creating MSIHANDLE (769) of type 790536 for thread 5876
MSI (s) (74:A4) [16:42:59:253]: Invoking remote custom action. DLL: C:\Windows\Installer\MSID856.tmp, Entrypoint: CreateDatabase
MSI (s) (74!7C) [16:43:01:493]: Creating MSIHANDLE (770) of type 790531 for thread 8060
MSI (s) (74!7C) [16:43:01:513]: Closing MSIHANDLE (770) of type 790531 for thread 8060
CustomAction CreateDatabase returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
MSI (s) (74:A4) [16:43:14:682]: Closing MSIHANDLE (769) of type 790536 for thread 5876
Обратите внимание, что в журнале не показан полезный код ошибки SQL - только (как всегда бесполезная) ошибка 1603 (перевод: что-то сломалось).
Какое отношение имеет перехват внешнего обработчика пользовательского интерфейса к созданию базы данных?
Я знаю, что проблема связана с моим внешним кодом обработчика пользовательского интерфейса, потому что, если я закорачиваю его с помощью "return MessageResult.None", то все работает.
Мой код обработчика верхнего уровня ниже; он основан на http://msdn.microsoft.com/en-us/library/aa368786(VS.85).aspx:
switch (messageType) {
case InstallMessage.FatalExit:
MessageBox.Show("FATAL EXIT: " + message, "Fatal exit",
MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
case InstallMessage.Error:
MessageBox.Show("ERROR: " + message, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
case InstallMessage.Warning:
MessageBox.Show("WARNING: " + message, "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
case InstallMessage.User:
// nothing to do here
break;
case InstallMessage.Info:
// nothing to do here
break;
case InstallMessage.FilesInUse:
MessageBox.Show("Files in use: " + message, "Files in use",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
break;
case InstallMessage.ResolveSource:
// nothing to do here
break;
case InstallMessage.OutOfDiskSpace:
MessageBox.Show("OUT OF DISK SPACE: " + message,
"Out of disk space", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
break;
case InstallMessage.ActionStart:
_enableActionData = false;
ProcessActionStart(message);
break;
case InstallMessage.ActionData:
ProcessActionDataMessage(message);
break;
case InstallMessage.Progress:
// http://msdn.microsoft.com/en-us/library/aa370573(VS.85).aspx
ProcessProgressData(message);
break;
case InstallMessage.CommonData:
// ignore for now
break;
case InstallMessage.Initialize:
case InstallMessage.Terminate:
SetHighLevelStatus(messageType.ToString());
break;
case InstallMessage.ShowDialog:
// nothing to do here
break;
}
AddDetailedStatusLine("... " + messageType + ":" + message);
return MessageResult.None;
//return MessageResult.OK;
Поскольку полный пользовательский интерфейс еще не реализован, только часть прогресса прямо сейчас, я возвращаю "Нет", чтобы внутренний пользовательский интерфейс продолжал работать. Очевидно, что это должно быть изменено до производства. То же самое относится и к вызовам MessageBox, которые могут по-разному рассматриваться в рабочем коде.
Спасибо!
1 ответ
В случае, если кто-то еще может с этим столкнуться, оказывается, что я столкнулся с исключением в коде, который не обрабатывал, поэтому он передавался вплоть до установщика Windows, который рассматривал исключение как сбой и откатывая назад.