您可以使用一个参数来让您的应用程序决定是作为服务启动还是作为常规应用程序启动(例如,在本例中显示表单或启动服务):
代码语言:javascript运行复制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“,你可以正常调试应用程序--单片机不会传递这个参数,所以你也可以在没有任何代码更改的情况下使用它作为服务(假设你是从ServiceBase派生的)
编辑:
windows服务的另一个区别是身份(对于InterOp来说,这一点可能特别重要)-你想要确保你在“应用”模式和服务模式下使用相同的身份进行测试。
要做到这一点,你可以在应用程序模式中使用模拟(如果有帮助,我可以发布一个C#包装器,但这可以很容易地用谷歌搜索)来使用你的windows服务将在其下运行的相同身份,即通常是LocalService或NetworkService。
如果需要其他身份,您可以向app.config添加设置,以允许您决定是否使用凭据,如果使用,则模拟哪个用户-这些设置将在作为应用程序运行时处于活动状态,但对windows服务关闭(因为服务已经在所需的身份下运行):
代码语言:javascript运行复制