IIS использует так называемую теневую копию для достижения этой цели.Вы могли бы реализовать нечто подобное для вашего хоста службы.По сути, идея заключается в том, что перед запуском службы вы копируете .DLL в другое место, и хост загружает ваш класс обслуживания из этой копии.Затем хост настраивает монитор файловой системы для прослушивания изменений исходного файла.Если он обнаруживает один, он останавливает службу, копирует новый файл и перезапускает.
РЕДАКТИРОВАТЬ
(1) Чтобы запустить ServiceHost с использованием класса в определенномбиблиотека типов, вам придется использовать отражение.Примерно так:
Assembly myAssembly = Assembly.LoadFile(path);
Type serviceType = myAssembly.GetType(className);
ServiceHost serviceHost = new ServiceHost(serviceType);
Из документации не ясно, как LoadFile разрешает зависимости.Возможно, вам придется подключить событие Assembly.ModuleResolve, чтобы эта работа работала.
(2) Мониторы файловой системы, безусловно, требуют некоторых затрат, но, по моему опыту, они минимальны.В любом случае, это действительно единственный вариант, если вы не хотите использовать установщик для обновленных DLL.
(3) Я не знаю, почему ваш файл заблокирован.Вам придется устранить это самостоятельно.