您可以使用参数让您的应用程序决定是作为服务启动还是作为常规应用启动(即在这种情况下显示表单或启动服务):
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)
编辑:
与 Windows 服务的另一个区别是身份(这对于 InterOp 可能尤其重要)——您要确保在“应用程序”模式和服务模式下以相同的身份进行测试。
为此,您可以在应用程序模式下使用模拟(如果有帮助,我可以发布一个 C# 包装器,但这可以很容易地用 Google 搜索)来使用您的 Windows 服务将在其下运行的相同身份,即通常是 LocalService 或 NetworkService。
如果需要其他身份,您可以将设置添加到 app.config 以允许您决定是否使用凭据,如果是,则模拟哪个用户 - 这些设置在作为应用程序运行时将处于活动状态,但对于 Windows 服务关闭(因为该服务已经在所需的身份下运行):