2013-03-22 19 views
1

我有一個C#windows服務。在該服務代碼中,我定義了Main()並捕獲各種參數。如果參數「安裝」,我會調用代碼來安裝該服務。請注意,當arg安裝時,我沒有運行該服務,只是安裝它,所以在我看來,這僅僅是一個控制檯應用程序。Console.WriteLine發送輸出到vs.net進行調試,但是當從控制檯運行時,我什麼都看不到

當我在vs.net 2012中調試代碼時,在調試窗口中看到我的所有Console.WriteLine()輸出。我相信這是因爲VS.NET將STDOUT映射到調試窗口。

但是,如果我打開命令提示符並運行命令行myservice.exe install,控制檯窗口沒有輸出。如果我運行myservice.exe install > out.txt,則會看到out.txt中的所有輸出。發生了什麼以及如何讓Main()代碼實際將輸出發送到控制檯窗口?

+0

Err ...不是'> out.txt'的重點將輸出重定向到文件?如果你只是執行'myservice.exe install'會怎麼樣? – 2013-03-22 06:38:03

+1

考慮使用* log4net *,* nlog *或其他日誌框架輕鬆切換輸出 – 2013-03-22 06:39:42

+0

slolife從我的經驗請檢查您的項目設置VS2012。我的感覺是,你可能在那裏檢查選項,禁用'console'視圖。 – Mithrand1r 2013-03-22 06:40:08

回答

3

這可能是由於您的項目的輸出類型;請注意,默認的Windows應用程序輸出類型不會自動顯示控制檯窗口。 爲此,您可能需要將輸出類型更改爲控制檯應用程序。

+0

好的,那就是訣竅。當我將Windows服務項目從Windows應用程序移動到控制檯應用程序時,我想要了解更多信息。 Windows服務應用程序是否需要成爲Windows應用程序?請注意,我沒有通過雙擊或任何東西啓動exe。我在一個控制檯中輸入命令行。我認爲任何Console.WriteLine()調用都會轉到控制檯或標準輸出。我怎樣才能以編程方式改變它? – slolife 2013-03-22 16:22:41

+2

Afaik移動到控制檯應用程序將只在您的程序集的PE頭中設置一個標誌,這將指示加載程序在加載時創建標準流並將其附加到標準流。 Windows服務不需要是Windows應用程序。 – 2013-03-22 16:41:24

+0

還有一個[技巧](http://stackoverflow.com/a/7827950/904178),它基本上使用幾個Win32 API附加到控制檯窗口,即使對於非控制檯應用程序,但我會遠離如果可能的話。 – 2013-03-22 16:43:46

相關問題