ОК, после битвы за 4 дня с этим bullsh * t, я наконец-то придумал что-то.
Я запускаю C# Custom Action перед окончанием установки, а затем обновляю разделы реестра в Uninstall [ProductCode]:
строка UNINSTALL_REGKEY = @ "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \"; string productCode = session ["ProductCode"];
Registry.SetValue (UNINSTALL_REGKEY + productCode, "UninstallString", "MsiExec.exe/x" + productCode + "DELFILES = TRUE", RegistryValueKind.String);
Registry.SetValue (UNINSTALL_REGKEY + код продукта, «WindowsInstaller», 0, RegistryValueKind.DWord);
(Примечание: значение в WindowsInstaller должно быть установлено равным 0 в противном случае он не будет использовать значение UninstallString в)
Теперь, когда я удалить свой продукт из Add/Remove Programs деинсталляция запускается с моей модифицированной UninstallString.
Надеюсь, что это поможет другим людям с той же проблемой.
Когда ваш продукт установлен с использованием пакета msi, я предполагаю, что он создает запись для себя в апплете добавления и удаления программ. Чтобы создать эту запись в апплете добавления и удаления программ, запись реестра будет создана в HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall (для 32-разрядных инсталляторов) или HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall (для 64-разрядных инсталляторов). В этом разделе реестра будет указано «Имя», называемое «UninstallString». Какова ценность, связанная здесь? –
Это просто: «MsiExec.exe/x [ProducCode]" – p4bl0