Настройка деинсталлятора проекта установки VS 2008

У меня есть проект установки для моего приложения .NET, и обе установки/удаления работают нормально, если их оставить в покое, пока они работают.

Однако, если кто-то отменяет удаление во время его обработки, откат, похоже, не обрабатывается правильно, и при повторной попытке удаления позже пользователь встречает исключение нулевой ссылки.

Я хотел бы просто упростить ситуацию; Я хотел бы лишить пользователя возможности отменить процесс удаления. Можно ли это сделать?

Спасибо, -Бен


person Ben    schedule 14.01.2010    source источник


Ответы (1)


Да, это возможно. MSDN перечисляет несколько вариантов; однако может быть проще просто исправить файл MSI, созданный Visual Studio. Это можно сделать с помощью Orca (установщик этого инструмента находится в папке Windows SDK, обычно в C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\orca.msi).

Orca позволяет редактировать таблицы базы данных MSI. Чтобы скрыть кнопку отмены, вам нужно будет добавить запись в таблицу ControlCondition (от здесь):

Dialog        | Control      | Action   | Condition
------------------------------------------------------
ProgressForm  | CancelButton | Hide     | 1

Эту ручную задачу по добавлению записи с помощью Orca, вероятно, лучше выполнить с помощью короткого VBScript, например:

Set oMsi = CreateObject("WindowsInstaller.Installer")

' get path to msi from command line
strMsiFullPath = Wscript.Arguments(0)
' open transacted
Set oDB = oMsi.OpenDatabase(strMsiFullPath , 1)

' insert a record into the [ControlCondition][3] table
Set oView = oDB.OpenView("INSERT INTO `ControlCondition` " & _
    "(`ControlCondition`.`Dialog_`, `ControlCondition`.`Control_`," & _
     "`ControlCondition`.`Action`, `ControlCondition`.`Condition`) " & _
     "VALUES ('ProgressForm', 'CancelButton', 'Hide', '1')")

' clean up
oView.Execute: oView.Close: oDB.Commit
Set oMsi = Nothing

Этот сценарий можно добавить в качестве шага после сборки в ваш проект установки (обратите внимание, что в переменной Visual Studio для выходного пути есть опечатка):

cscript $(ProjectDir)patch.vbs $(BuiltOuputPath)
person Dirk Vollmar    schedule 15.01.2010
comment
Хороший ответ. Вы определенно указали мне правильное направление. К сожалению, «ProgressForm» — это не диалоговое окно, показывающее прогресс во время удаления. Фактически, я просмотрел все диалоги в таблице диалогов и добавил номера к заголовкам, чтобы я мог отследить этот диалог, но безуспешно. Я предполагаю, что диалоговое окно хода удаления нельзя редактировать с помощью таблицы ControlCondition. Тем не менее, я ценю ответ, поскольку он открыл для меня много возможностей для настройки. Спасибо :) - person Ben; 16.01.2010