Я думаю, что это - самый простой путь, где Вам только нужны две проверки:
string file = @"C:\tmp";
if (System.IO.Directory.Exists(file))
{
// do stuff when file is an existing directory
}
else if (System.IO.File.Exists(file))
{
// do stuff when file is an existing file
}
У меня почти идентичный установщик, который отлично работает. Единственное отличие состоит в том, что мой элемент ServiceControl имеет другой идентификатор элемента ServiceInstall, а также свойство 'Start = "install"'.
Я подозреваю, что ваша проблема связана либо с идентификатором элемента ServiceControl, либо у вас есть случайный служба зависает.
Попробуйте следующее:
Если изменение идентификатора компонента сработало, я бы подозревал, что проблема может быть связана с ошибочным счетчиком ссылок SharedDLL в реестре по адресу: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SharedDlls
Это счетчики ссылок в устаревшем стиле, которые MSI может увеличивать (по запросу) - и они переопределяют собственный счетчик ссылок MSI. По какой-то глупой причине Installshield увеличивает счетчик устаревших ссылок для всех файлов (независимо от того, имеют ли они версии или нет), и это часто приводит к загадочным «случайным файлам при удалении», возникающим на компьютерах разработки. То же самое может произойти в Wix, если вы включите общий счетчик ссылок dll, и в редких случаях счетчик ссылок может быть поврежден во время крупных обновлений.