Вы можете использовать параметр, чтобы ваше приложение решало, запускать ли оно как службу или обычное приложение (т.е. в этом случае показывать форму или запускать службу):
static void Main(string[] args)
{
if ((1 == args.Length) && ("-runAsApp" == args[0]))
{
Application.Run(new application_form());
}
else
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyService() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
}
Теперь, если вы передадите параметр "-runAsApp", вы сможете нормально отлаживать приложение - SCM не пропустит этот параметр, поэтому вы также можете использовать его как сервис без каких-либо изменений кода (при условии, что вы наследуете от ServiceBase
)
Edit:
Другое отличие от служб Windows - идентификация (это может быть особенно важно для InterOp) - вы хотите убедиться, что вы тестируете под тем же идентификатором в режиме «приложения», а также в режиме службы.
Для этого вы можете использовать олицетворение (я могу опубликовать обертку C #, если это поможет, но это можно легко погуглить) в режиме приложения, чтобы использовать тот же идентификатор, под которым будет работать ваша служба Windows, то есть обычно LocalService или NetworkService.
Если требуется другое удостоверение, вы можете добавить параметры в app.config, которые позволят вам решить, использовать ли учетные данные и, если да, какого пользователя выдавать себя за пользователя - эти параметры будут активны при запуске в качестве приложения, но отключены для служба windows (так как служба уже запущена с нужным именем):
<appSettings>
<add key="useCredentials" value="false"/>
<add key="user" value="Foo"/>
<add key="password" value="Bar"/>
</appSettings>