2010-09-17 91 views
9

我們正在開發,我們希望能夠運行爲Windows服務的Windows Presentation Foundation的應用。運行WPF應用程序作爲Windows服務

沒有人做這樣的事情?
可能嗎?

我們不需要與桌面或任何GUI交互,這純粹是不錯的一個應用,我們可以使用GUI運行,從命令行(的作品),或者作爲一個服務。

期待有趣輸入:-)

回答

12

由於拇指服務規則不應該有什麼樣的用戶界面。這是因爲服務通常以非常高的權限運行,如果您不太注意輸入,就會發生不好的事情。 (我認爲最新版本的Windows不會讓你從服務中創建UI,但我不是100%確定的。)

如果您需要與服務進行通信,則應該使用某種形式的IPC( WCF,管道,插座,  ...)。如果你想要一個簡單的控制檯程序,也可以是服務,我知道一個把戲設置了:

class MyExampleApp : ServiceBase 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("--console")) 
     { 
      new MyExampleApp().ConsoleRun(); 
     } 
     else 
     { 
      ServiceBase.Run(new MyExampleApp()); 
     } 
    } 
    private void ConsoleRun() 
    { 
     Console.WriteLine(string.Format("{0}::starting...", GetType().FullName)); 

     OnStart(null); 

     Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName)); 
     Console.ReadLine(); 

     OnStop(); 

     Console.WriteLine(string.Format("{0}::stopped", GetType().FullName)); 
    } 
    //snip 
} 

如果只是啓動該程序,它將啓動服務(如果罵你你可以從控制檯運行它),但是如果在啓動時添加參數--console,程序將啓動並等待您輸入以關閉。

+0

這適用於CLI和服務。 – 2010-09-17 15:33:23

+0

感謝您的代碼。必須深入瞭解服務內容以瞭解OnStop部分。 – Remy 2010-09-18 18:36:14

0

如果你已經擁有它的命令行工作的你走了一半。有些應用程序只有當您想要將應用程序作爲服務運行時使用的簡單標誌名稱,請檢查這些標誌並相應地讓您的邏輯流動。例如:

myapp.exe --runservice 
+0

不錯的建議,但是我發現通常CLI作爲默認服務運行會更好。它簡化了設置。 – 2010-09-20 01:42:39

3

不要這樣做。將所有內容寫入引擎程序集,然後從GUI和服務中引用它。 CLI可以是第三個可執行文件,也可以是服務可執行文件的重用。關鍵是允許服務在沒有任何引用WPF或WinForms或任何GUI框架的情況下運行。

+0

我也在想這個。聽起來像是一個合理的解決方案。但是爲什麼對WPF或WinForms的引用不好?只要它只是一個參考? – Remy 2010-09-18 18:23:28

+0

@Remy:靜態引用在開始時加載程序集。 – 2010-09-20 01:42:09

0

我的解決辦法是增加一個主入口的功能,如:

public static void Main() 
{ 
    ServiceBase.Run(new MyService()); 
} 

現在我們有兩個應用程序啓動項,一爲WPF,一個用於Windows的服務;

我們可以在Visual Studio中配置啓動對象 - >項目屬性 - >應用程序 - >啓動對象。

所以設置進入和重建,U將得到ü想要的東西。

相關問題