有没有什么方法,创建此windows服务之后,不用手动启动,一运行此windows服务,它就自启动了?
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,本人想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位高手指点
现在这个windows方法,运行完毕之后,需要手动去启动,但是关机开机之后他能自启动,本人想要的是,运行完毕之后能达到像开机关机之后自启动这个情况,希望各位高手指点
解决方案
10
本人去看下Program.cs的Main函数吧
默认假如是服务的话通过ServiceBase.Run来运行
你可以本人加个参数,直接执行相应的方法
默认假如是服务的话通过ServiceBase.Run来运行
你可以本人加个参数,直接执行相应的方法
10
你可以把一个windows service工程(修改应用程序属性)重新设置为“控制台应用”,然后以你说得控制台方式执行。
控制台方式的 main 可以这样写(例如)
控制台方式的 main 可以这样写(例如)
static void Main(string[] args)
{
if (args.Length == 0)
{
#if !DEBUG
ServiceBase.Run(new Service());
#else
ShowHelp();
#endif
return;
}
if (args.Contains("-i"))
{
Uninstall(true);
端口.ForEach(p => 打开防火墙(p));
Install();
return;
}
if (args.Contains("-u"))
{
Uninstall();
return;
}
if (args.Contains("-t"))
{
Uninstall(true);
Execute(true);
Console.WriteLine("系统进入Pending状态。请按 Ctrl+Break 退出.....");
var eh = new ManualResetEvent(false);
Console.CancelKeyPress += (s, e) =>
{
eh.Set();
};
eh.WaitOne();
return;
}
ShowHelp();
}
private static void ShowHelp()
{
Console.WriteLine("命令参数格式:");
Console.WriteLine("\t-i:安装windows服务。");
Console.WriteLine("\t-u:卸载windows服务。");
Console.WriteLine("\t-t:以控制台方式执行服务。");
}
private static void 打开防火墙(int port)
{
var inf = new ProcessStartInfo
{
UseShellExecute = true,
FileName = "netsh",
Arguments = " firewall set portopening TCP " + port,
WindowStyle = ProcessWindowStyle.Hidden
};
var p = Process.Start(inf);
p.WaitForExit();
}
private static void Uninstall(bool 独立窗口 = false)
{
Console.WriteLine("停止 " + SvrName);
var info = new ProcessStartInfo("sc", "stop " + SvrName)
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = 独立窗口
};
var pro = Process.Start(info);
pro.WaitForExit();
Console.WriteLine("卸载 " + SvrName);
info.Arguments = "delete " + SvrName;
pro = Process.Start(info);
pro.WaitForExit();
}
private static void Install()
{
#if DEBUG
Console.WriteLine("以 DEBUG 模式编译的程序不应安装为 windows 服务。请重新编译程序。");
#else
Console.WriteLine("创建 " + SvrName);
//注意这些选项以等号结束,然后要有一个空格,后边才能跟选项值。一定不能缺少空格。
var info = new ProcessStartInfo("sc", string.Format("create {0} binpath= "{1}" displayname= "{2}" start= auto type= own",
SvrName, Process.GetCurrentProcess().MainModule.FileName, SvrDisplay))
{
WindowStyle = ProcessWindowStyle.Minimized,
UseShellExecute = false
};
var pro = Process.Start(info);
pro.WaitForExit();
Console.WriteLine("启动 " + SvrName);
info.Arguments = "start " + SvrName;
pro = Process.Start(info);
pro.WaitForExit();
#endif
}
10
Execute(); 实际上就是你的执行业务处理的主程序。你的服务中可能就是这样调用它的
partial class Service : ServiceBase
{
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(h=> Program.Execute(false)); //自定义参数表示能否是控制台调用
}
}
所以,一个控制台程序,它可以用“命令行参数”来控制服务的安装、卸载。并且也可以以控制台方式测试执行。
10
调用执行一个*.bat文件好了,bat文件restart 你的电脑
10
你的所谓“用cmd命令行创建此服务”于这里的
abc.exe -i
命令的区别,你本人一看便知。
这里,abc.exe 把本人安装为服务器,然后立刻启动了服务器!
abc.exe -i
命令的区别,你本人一看便知。
这里,abc.exe 把本人安装为服务器,然后立刻启动了服务器!
10
呵呵,随时卸载和安装服务,是不用启动电脑的哇。
5
sc create [Name] binpath= "[path]" start= auto
每个=后面有一个空格
5
假如是客户端的exe 直接 用哪个 电脑自带的计划任务就行,然后设置一下
30
通常,在服务器上第一次安装服务,或服务程序改动很大,你需要先用控制台方式运行一下,观察一小会儿(这时候客户端各种程序照常对它测试)。确认它没有抛出 bug、没崩溃,再用 -i 方式安装和启动它。假如直接启动服务,假如它运行时有 bug,你不容易看到。所以其实服务应该这样设计,是最简洁实用的。
另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,假如不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的全部程序的版本。
另外,我们的服务只有11k字节,会自动到web服务器上自动与本地目录里边的文件进行,假如不一样就下载互联网上的 dll、exe文件,然后重新“热更新”本地插件。每一分钟都去网络上比较一次(比较文件的 md5 即可)。这样的服务可以不停机(不手动操作它)而随时更新里边的全部程序的版本。