2009-02-20 85 views
1

我想使用C#創建一個應用程序:如何創建一個Windows應用程序,可以使用GUI *或*作爲C#中的Windows服務運行?

  • 可以運行一個Windows應用程序,具有圖形用戶界面(它會顯示進度,狀態等)

    OR

  • 可以運行作爲Windows服務,沒有GUI

這可能嗎?有人能讓我開始嗎?

我想替代方案是我可以創建一個Windows服務,然後是一個單獨的GUI應用程序,它可以輪詢Windows服務以從中獲取數據(進度,狀態等)。

在這種情況下......如何從我的GUI應用程序中從Windows服務中獲取數據?

回答

6

我正在做類似於你要求的東西。我編寫了它,以便如果您將命令行參數「/ form」發送給可執行文件,它將彈出一個窗體窗體,而不是作爲服務運行。

就運行後臺作業本身而言,在這兩種情況下,您都需要執行某種線程(可能帶有計時器)來完成工作並以異步方式將狀態報告回窗體。這將是關於創建線程化GUI應用程序的完全不同的討論主題。

「形或服務」的代碼是這樣的:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    private static void Main(string[] args) 
    { 
     if (args.Length > 0 && args[0] == "/form") 
     { 
      var form = new MainForm(); 
      Application.Run(form); 
      return; 
     } 

     var ServicesToRun = new ServiceBase[] 
      { 
       new BackgroundService() 
      }; 

     ServiceBase.Run(ServicesToRun); 
    } 
} 
1

你應該選擇後者去了。創建您的服務,然後創建一個獨立的GUI應用程序。大部分的管理工作已經在框架中爲您提供了。看看ServiceController類。

+0

這個選項聽起來目前最有前途......但我需要做的不僅僅是停止,啓動和暫停服務。我需要能夠發送特定於服務的命令以使其執行其他操作,併發送命令以從服務中檢索數據... ServiceController可以執行此操作嗎? – 2009-02-20 01:07:01

2

我從來沒有做過可以作爲Windows服務或GUI運行的應用程序,但我們有很多應用程序可以使用編譯器標誌在控制檯應用程序和Windows服務之間切換。 (我剛剛看到了cmd行arg的答案 - 甚至可能會更好!)

我們通常只需使用編譯器標誌在兩者之間切換。下面是一個例子......我完全沒想到這通過,但它可能給你一個開始:

#define RUN_AS_SERVICE 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.ServiceProcess; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
#if RUN_AS_SERVICE 

      System.ServiceProcess.ServiceBase[] ServicesToRun; 
      ServicesToRun = new System.ServiceProcess.ServiceBase[] 
      { 
       new MyService() 
      }; 
      System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
#else 
      // Run as GUI 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
#endif 
     } 
    } 
    public class MyService : ServiceBase 
    { 
     protected override void OnStart(string[] args) 
     { 
      // Start your service 
     } 

     protected override void OnStop() 
     { 
      // Stop your service 
     } 
    } 
} 
2

在庫中構建實際的應用程序。然後,你可以添加任何你想要的UI(我這麼說,因爲服務不是一個真正的UI)。只要您將應用程序視爲Windows應用程序和服務應用程序,就可以開發兩個應用程序。如果您將應用程序視爲解決的業務問題,那麼您將會考慮Windows窗體UI和服務UI,這更符合您的需求。

雖然這聽起來很健全,但您會驚訝有多少應用程序需要完全覆蓋才能成爲不同的UI類型。感謝你的提問。它說服我需要我寫的這本書。:-)

相關問題