.net里面编写Windows服务很这容易,它与普通的windows程序没什么不一样,Windows服务的启动代码为
ServiceBase.Run(new ServiceBase());
一般Windows程序的启动代码为:
Application.Run(new Form());其它地方都一样,除了服务没有UI外(以特殊方式可以产生与用户交互的UI)。现在我的难题是,如果是由net start来启动我的程序,我需要执行ServiceBase.Run方法,而如果是用户双击鼠标或命令行执行,我则需要执行Application.Run方法。有什么办法可以知道当前程序是由哪种方式执行的呢?解决后再加送100分已示感谢。
ServiceBase.Run(new ServiceBase());
一般Windows程序的启动代码为:
Application.Run(new Form());其它地方都一样,除了服务没有UI外(以特殊方式可以产生与用户交互的UI)。现在我的难题是,如果是由net start来启动我的程序,我需要执行ServiceBase.Run方法,而如果是用户双击鼠标或命令行执行,我则需要执行Application.Run方法。有什么办法可以知道当前程序是由哪种方式执行的呢?解决后再加送100分已示感谢。
如果我能判断的话,就可以在用户双击的时候去调用Net Start,或者做别的事。
@zhuawang(一艘没有航行目标的船,任何方向的风都是逆风)
做标记的方法是不太可行的。
比如: 1 -> 为服务启动...
2 -> 为用户双击...要想知道程序的启动方式.读取文件就可以啦...这只是一种思路...
文本文件的内容默认为: 2 (用户双击)...如果程序由ServiceBase.Run();方式启动, 就要在之前完成文件的写入操作.改为: 1 (服务启动)这样, 在Application.Run();之后就做判断文本内容的操作...如果条件成立, 在做完LZ所说的其他事情后, 再将保存的值改为2就可以啦...
可執行文件只有一份,比如1.exe, 在C:\abc目錄里面
你的意思是說,在執行程序前先改放在abc目錄里的文本文件,這樣是不行的,因為程序不是我用,是用戶在用,跟用戶解釋什么是服務恐怕得花一周的時間了 ~~~我想要的解決方法是:
在Main()里面,得到當前的執行方式,不要通過外部的標記。多謝大家了。
1. 首先将主程序当中的Main()改为Main(string[] args)...[STAThread]
static void Main(string[] args)
{
if (args.Length > 0)
{
MessageBox.Show("这是Windows服务方式启动的! - 命令: " + args[0].ToString());
} Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());
}
2. 然后在服务ServiceBase.Run()的时候, 用如下代码来启动主程序就可以了...System.Diagnostics.Process.Start(@"C:\abc\1.exe", "^o^ 测试通过!");
注意: 用户双击[快捷方式]的时候绝对不会运行if语句里的内容...看来LZ可以结贴了...
打個比方吧,我們做控件的時候,會經常使用一個屬性:DesignMode 來判斷當前是設計模式還是運行模式,我想要的就是這樣子的功能:Main()
{
if (ServiceMode)
{
ServiceBase.Run()
}
else
{
Application.Run()
}
}有沒有一個方法來判斷這個 ServiceMode 的值,當前是服務模式還是一般模式。解決了馬上結貼
另外,上面的第2點是不對的,因為你這種方式啟動是看不到界面的,普通的服務是看不到界面的。
private static bool IsService()
{
return Environment.UserName == "SYSTEM";
}不知道有没有更好的。