.net里面编写Windows服务很这容易,它与普通的windows程序没什么不一样,Windows服务的启动代码为
ServiceBase.Run(new ServiceBase());
一般Windows程序的启动代码为:
Application.Run(new Form());其它地方都一样,除了服务没有UI外(以特殊方式可以产生与用户交互的UI)。现在我的难题是,如果是由net start来启动我的程序,我需要执行ServiceBase.Run方法,而如果是用户双击鼠标或命令行执行,我则需要执行Application.Run方法。有什么办法可以知道当前程序是由哪种方式执行的呢?解决后再加送100分已示感谢。

解决方案 »

  1.   

    当然有意义,如果用户双击执行了ServiceBase.Run(new ServiceBase());代码,就会有一个提示说必须使用Net Start去启动。
    如果我能判断的话,就可以在用户双击的时候去调用Net Start,或者做别的事。
    @zhuawang(一艘没有航行目标的船,任何方向的风都是逆风)
    做标记的方法是不太可行的。
      

  2.   

    每当程序启动时,无论是由服务运行还是用户双击动行也好,都要在程序的启动路径下建一个文本文件(其他格式也可), 以履盖的方式创建, 然后在文本中录入内容... 
    比如: 1 -> 为服务启动...
          2 -> 为用户双击...要想知道程序的启动方式.读取文件就可以啦...这只是一种思路...
      

  3.   

    再说明一点:
    文本文件的内容默认为: 2 (用户双击)...如果程序由ServiceBase.Run();方式启动, 就要在之前完成文件的写入操作.改为: 1 (服务启动)这样, 在Application.Run();之后就做判断文本内容的操作...如果条件成立, 在做完LZ所说的其他事情后, 再将保存的值改为2就可以啦...
      

  4.   

    多謝 shinaterry(簡簡單單..)  熱心的幫助,可是這樣並不能解決的我問題啊,
    可執行文件只有一份,比如1.exe, 在C:\abc目錄里面
    你的意思是說,在執行程序前先改放在abc目錄里的文本文件,這樣是不行的,因為程序不是我用,是用戶在用,跟用戶解釋什么是服務恐怕得花一周的時間了 ~~~我想要的解決方法是:
    在Main()里面,得到當前的執行方式,不要通過外部的標記。多謝大家了。
      

  5.   

    这样的话就可以通过System.Diagnostics.Process类来实现. 具体实现步骤如下:
    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可以结贴了...
      

  6.   

    感謝感謝 shinaterry(簡簡單單..) 我的意思是這樣子的,
    打個比方吧,我們做控件的時候,會經常使用一個屬性:DesignMode 來判斷當前是設計模式還是運行模式,我想要的就是這樣子的功能:Main()
    {
       if (ServiceMode)
       {
          ServiceBase.Run()
       }
       else
       {
         Application.Run()
       }
    }有沒有一個方法來判斷這個 ServiceMode 的值,當前是服務模式還是一般模式。解決了馬上結貼
    另外,上面的第2點是不對的,因為你這種方式啟動是看不到界面的,普通的服務是看不到界面的。
      

  7.   

    你的意思是在用户双击[快捷方式]启动时...在程序的Main方法里面利用[ServiceMode]的值来判断启动对象(是[服务]还是[程序])吗???另外, 您不是也知道服务以特殊方式可以产生与用户交互的UI吗???
      

  8.   

    目前我的做法是,在服务中指定启动用户为SYSTEM,然后检查用户名。
       private static bool IsService()
        {
            return Environment.UserName == "SYSTEM";
        }不知道有没有更好的。