2013-02-04 64 views
0

我用拖的方法來記錄我的應用程序(Windows應用程序)到文件和控制檯屏幕如何啓動控制檯屏幕在窗口服務

public static void InitLogFile(string filename) 
{ 

    FileStream fs = new FileStream(filename, FileMode.Create); 
    Trace.Listeners.Add(new TextWriterTraceListener(fs)); 
    Trace.AutoFlush = true; 

} 
public static void InitConsole() 
{ 
    Trace.Listeners.Add(new ConsoleTraceListener()); 
    Trace.AutoFlush = true; 
} 

,我用這個代碼啓動控制檯屏幕時,我的Windows應用程序開始

[DllImport("kernel32.dll",EntryPoint = "GetStdHandle",SetLastError = true,CharSet = CharSet.Auto, 
     CallingConvention = CallingConvention.StdCall)] 
     private static extern IntPtr GetStdHandle(int nStdHandle); 

     [DllImport("kernel32.dll",EntryPoint = "AllocConsole",SetLastError = true,CharSet = CharSet.Auto, 
     CallingConvention = CallingConvention.StdCall)] 
     private static extern int AllocConsole(); 


     private const int STD_OUTPUT_HANDLE = -11; 
     private const int MY_CODE_PAGE = 437; 

     void StartConsole() 
     { 
      AllocConsole(); 
      IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
      var safeFileHandle = new SafeFileHandle(stdHandle, true); 
      var fileStream = new FileStream(safeFileHandle, FileAccess.Write); 
      var encoding = Encoding.GetEncoding(MY_CODE_PAGE); 
      var standardOutput = new StreamWriter(fileStream, encoding) {AutoFlush = true}; 
      Console.SetOut(standardOutput); 
     } 

我的問題是:

我在我的Windows應用程序轉換爲windows service控制檯日誌屏幕無法正常工作,現在該如何工作?

回答

2

Windows服務並不像一個標準的Windows應用程序運行。當沒有用戶登錄到計算機怎麼可能一個控制檯屏幕顯示它可以運行?

當你應該考慮寫入Windows事件日誌或其他一些記錄機制,而不是服務運行。

1

你看不到任何東西的原因是因爲Session 0 Isolation

但是,有一個很好的代碼項目article它將在用戶會話中從服務運行應用程序。

使用鏈接中的項目只要把你的代碼放到一個exe文件,並啓動exe文件。

+0

是true,但會話0隔離的原因是因爲Windows服務不應該是交互式的。運行在用戶會話是一個很好的「黑客」,如果你需要調試的服務,例如,但不應該在生產中使用。否則,爲什麼要在開始時創建服務? –

+0

是的,但我只是回答問題,如果他們想創建一個服務來做到這一點,那麼他們可以用這種方式。我同意這不是必要的,有更好的方法,但這只是回答了問題的要求。 –

+0

沒錯,只是指出@ tito11應該問自己,他所要求的是好的,如果控制檯窗口是一個好主意還是壞主意,更多的理由 –