Другое возможное решение состоит в том, чтобы иметь отдельную службу, которая работает, останавливает другую, если есть обновление, а затем обновляет службу. Само обновление службы не может быть, потому что .dll, которая работает, не остановится.
Хорошим вариантом будет разделение слоя бизнес-логики. Вы также можете переписать основной сервис, чтобы он работал в режиме отражения от основного или управляющего сервиса. Это похоже на разделение бизнес-логики, и для этого потребуется просто остановить поток и запустить его снова.
Я не знаю ни одного известного фреймворка, который бы это делал. Я сделал это сам, но это не публичная структура.