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, который рассматривал исключение как сбой и откатывая назад.

Другие вопросы по тегам