На вашем месте я бы применил двойной подход.
Я бы поместил всю свою бизнес-логику в библиотеку C # (скажем, widget.core.dll).
Тогда, в вашем сервисном приложении, только минимально необходимый запуск и остановка сервиса (т.е. не намного больше, чем стандартный шаблон, который генерирует VS), и вызов непосредственно в ваш core.dll.
Также напишите консольное приложение, которое при необходимости принимает некоторые входные параметры, и этот вызов вызывает те же методы в вашем core.dll, что и ваша служба. Опять же, это консольное приложение должно иметь только едва достаточный код для обработки аргументов и соответствующего вызова основной библиотеки. Это консольное приложение затем можно вызвать вручную или как запланированное задание.
Отделив основную библиотеку от реализации службы или консоли, вы значительно упростите тестирование приложения, поскольку вся логика процесса acutaly должна быть в core.dll и вызываться из модульных тестов, тестового кода. или консольное приложение.
С очень небольшими дополнительными затратами вы даете пользователю возможность использовать приложение в качестве службы или запланированной задачи (в зависимости от их предпочтений, среды и т. Д.).
service.exe --
|
--> core.dll
|
console.exe--