我将从一个例子开始:Apache Web 服务器(在 Windows 下)有一个很好的功能:它既可以作为独立应用程序运行(具有当前用户权限),也可以直接作为 Windows 服务安装和运行(作为本地系统帐户),使用相同的可执行文件。
为了使应用程序作为独立应用程序运行,它所需要做的就是在某个公共类中使用 static public Main() 。
为了使应用程序能够作为服务安装和运行,它必须以某种方式实现 ServiceBase 和 Installer 类。但是,如果像这样的应用程序作为独立应用程序运行,它将显示消息框。
这种类似Apache的运行模式是如何实现的呢?我相信解决方案很简单,但我真的不知道从哪里开始。
下面的代码段用于调用服务。可以修改为允许独立使用吗?
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service() // defined elsewhere as Service : ServiceBase
};
ServiceBase.Run(ServicesToRun);
}
}
我选择的语言是 C#。
Edit:目前,我已将通用代码抽象为单独的程序集(我们称之为 Library.dll),并且我有两个可执行文件:Console.exe 和 Service.exe,它们分别是独立应用程序和 Windows 服务应用程序,两者都只是调用的方法库.dll。
我的目标是将这两个可执行文件合并为一个,但仍会调用 Library.dll。
在 C# 中,一种简单的方法是需要命令行参数将其作为服务运行。如果参数不存在,则运行您的表单/控制台应用程序。然后让安装程序在安装服务时将参数包含在可执行路径中,如下所示:
C:\MyApp\MyApp.exe -service
它看起来像这样:
static void Main(string[] args)
{
foreach (string arg in args)
{
//Run as a service if our argument is there
if (arg.ToLower() == "-service")
{
ServiceBase[] servicesToRun = new ServiceBase[] { new Service1() };
ServiceBase.Run(servicesToRun);
return;
}
}
//Run the main form if the argument isn't present, like when a user opens the app from Explorer.
Application.Run(new Form1());
}
这只是一个给您一个想法的示例,可能有更简洁的方法来编写此代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)