您可以使用参数让您的应用程序决定是作为服务还是常规应用程序启动(即在本例中显示表单或启动服务):
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尤为重要) - 您希望确保在“app”模式和服务模式下以相同的身份进行测试 .
为此,您可以在应用模式下使用模拟(我可以发布C#包装器,如果它有帮助,但可以轻松搜索),以使用您的Windows服务将运行的相同标识,即通常是LocalService或NetworkService .
如果需要其他身份,您可以向app.config添加设置,以便您决定是否使用凭据,如果是,则使用哪个用户进行模拟 - 这些设置在作为应用程序运行时处于活动状态,但是对于Windows服务已关闭(因为服务已经在所需的身份下运行):