2015-11-04 3 views
0

В моем msi я должен вызвать установленный exe-файл с некоторыми параметрами, как очень первое действие удаления. Вот код:Wix: Выполнение установленного exe в качестве первого действия при удалении

<CustomAction Id="UnRegisterOnUninstallApplication" 
       Execute="immediate" 
       FileKey="MyProgram.exe" ExeCommand="/unregister" Return="asyncNoWait" /> 

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallInitialize"/> 
    <Custom Action="UnRegisterOnUninstallApplication" Before="UnpublishComponents" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom> 
</InstallExecuteSequence> 

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

Может ли кто-нибудь посоветуйте, если я что-то упустил или что-то сделал не так ??? Спасибо, кучка.

ответ

0

Я могу запланировать действие до «RemoveFiles», чтобы никакие зависимые dll не были удалены до того, как ваше пользовательское действие будет запущено.

2

Есть несколько вещей, которые неправильно здесь:

  1. Дизайн проблема в том, что вы не должны быть запущен код для регистрации или отмены регистрации. Рекомендуемый способ - захватить записи реестра и добавить их в качестве записей в реестре в том же компоненте, что и этот двоичный файл. Тогда все работает.

  2. Ваше собственное действие - asyncNoWait, а это значит, что удаление продолжается во время запуска программы. Если по какой-то причине требуется много времени или просто не хватает процессора, то да, файлы могут быть удалены к моменту запуска.

  3. Это немедленное пользовательское действие, поэтому оно может запускаться и запускаться из-за регистрации при продолжении удаления. Однако, если удаление завершится неудачей и откатится, удаленная регистрация не будет восстановлена, так что в конечном итоге вы потеряете сломанный продукт, эти записи будут удалены. Это должно быть отложенное пользовательское действие, а return = игнорировать или проверять в зависимости от того, не заботится ли программа о сбое.

Смежные вопросы