Я не уверен, что installState - это ваша проблема. Это просто файл, содержащий различные пары ключ-значение, я не думаю, что там что-то происходит с умом.
Это звучит для меня как (встроенный) процесс деинсталлятора: «Мне нужно удалить этот ключ, но он не пустой, поэтому я собираюсь его оставить».
Не могли бы вы поместить все создание ключа / записи в реестре (и, как следствие, удаление всех ключей / записей) в dll Custom Action?
Другая проблема, с которой я столкнулся при установке InstallState - и именно поэтому я стараюсь ее избегать, - это то, что люди не могут прийти и удалить файл installState. В зависимости от того, как вы написали свое действие по удалению, это может означать, что вы никогда не получите чистую деинсталляцию своей программы, потому что вы получите исключения, когда попытаетесь прочитать то, что, как вы ожидаете, будет в словаре, который отсутствует. *
Поскольку вы, похоже, уже используете специальное действие dll для выполнения этой работы, надеюсь, мое предложение не столь обременительно?