2011-03-01 179 views
21

我要調試Windows服務,但它會彈出一個錯誤信息說運行Windows服務作爲一個控制檯應用程序

無法從命令 線或調試器啓動服務。必須使用 installutil.exe安裝Windows服務 ,然後使用服務器資源管理器,Windows服務 管理工具或NET啓動 命令以 開頭。

我真的沒有關於此錯誤的任何想法.....

enter image description here

+4

可以發誓我解釋之一[剛看到這樣一個帖子(http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –

回答

32

前一個Windows服務可以運行,它必須「安裝」首先使用installutil。 EG:

C:\installutil -i c:\path\to\project\debug\service.exe 

然後你可以打開服務列表來啓動它。 EG:

  1. 右鍵單擊「我的電腦」
  2. 點擊「管理」
  3. 打開「服務和應用程序」
  4. 點擊「服務」
  5. 在列表中找到您服務,上右鍵單擊它
  6. 單擊「開始」

一旦開始,你可以去到Visual斯圖dio,點擊'Debug',然後點擊'Attach to Process'。

另一種技術是這一行添加到您的OnStart()方法,在服務:

System.Diagnostics.Debugger.Launch(); 

當你做到這一點,它會提示你選擇Visual Studio中的一個實例來調試服務。

+1

另外,我發現在OnCommitted方法中使用下面的方法創建一個安裝程序的效果非常好:使用(ServiceController sc = new ServiceController(__ SERVICENAME __)){sc.Start();} (或者您可以按照描述手動啓動)。 –

+1

對不起,但我無法執行此操作C:\ installutil -i c:\ path \ to \ project \ debug \ service.exe – pinki

+0

manasareddy,當您嘗試時會發生什麼? –

13

您可以更改根據您是否是在調試模式下(通常是內部的Visual Studio,但不一定是),或發佈模式組件的啓動模式(當它運行在生產服務):

更改此:

static class Program 
{ 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

到:

static class Program 
{ 
    static void Main() 
    { 
     #if(!DEBUG) 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new MyService() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     #else 
      MyService myServ = new MyService(); 
      myServ.Process(); 
      // here Process is my Service function 
      // that will run when my service onstart is call 
      // you need to call your own method or function name here instead of Process(); 
     #endif 
    } 
} 

該技術是從this article採取和信用是文章的作者,Tejas的Vaishnav。我在這裏複製了代碼片段,因爲它贊成完整的答案,而不是可能會消失一段時間的鏈接。

+0

因此,這將只運行myServ.Process()並退出? –

+0

基本上。保持繁忙是你的責任。 –

+0

我的觀點是它與運行服務不同。 –

1

請檢查您是否處於「DEBUG」或「RELEASE」模式。當我嘗試在「RELEASE」模式下調試服務時,出現此錯誤。當我將其改爲「DEBUG」時,一切正常。

這是在您正確安裝上述其他人建議的服務之後。

0

我有同樣的錯誤。試過@C。勞倫斯的解決方案。雖然我發現我的服務在服務列表中運行,但仍然出現相同的錯誤。我已經閱讀了一個建議在調試菜單中附加到進程的博客,看到我在進程列表中看不到我的服務。

我將不勝感激對此問題的可能解決方案的建議。

謝謝。

+1

中將輸出類型設置爲控制檯應用程序,這不應該是答案。它應該是一個評論或一個新的問題(如果沒有這樣的現有問題) – Joshua

+0

是的,問題是我在這個地方是新的,無法評論,直到我得到50分或什麼?對不起,搞砸了。無論如何感謝您的評論。 – CodeJammer

+0

我想你需要以管理員權限運行才能連接到服務進程。您應該能夠通過管理員命令提示符使用'sc queryex <服務名稱>'來檢查PID。您也可以單擊附加到處理屏幕中的PID列標題,按PID排序。 –

1

爲防止發生此錯誤並允許服務在常規服務控制器之外運行,您可以檢查Environment.UserInteractive標誌。如果已設置,則可以將輸出運行到服務器而不是讓它運行到返回該錯誤的ServiceBase代碼。

一下添加到Program.Main()開始,在此之前使用ServiceBase的代碼來運行服務:

 if (Environment.UserInteractive) 
     { 
      var service = new WindowsService(); 
      service.TestInConsole(args); 
      return; 
     } 

隨着的OnStart和調用OnStop方法是在你的服務protected你需要添加另一個方法是類,你可以從主(運行),並調用這些方法適合你,比如:

public void TestInConsole(string[] args) 
    { 
     Console.WriteLine($"Service starting..."); 
     this.OnStart(args); 
     Console.WriteLine($"Service started. Press any key to stop."); 
     Console.ReadKey(); 
     Console.WriteLine($"Service stopping..."); 
     this.OnStop(); 
     Console.WriteLine($"Service stopped. Closing in 5 seconds."); 
     System.Threading.Thread.Sleep(5000); 
    } 

最後,確保輸出是在項目的屬性控制檯應用程序。

您現在可以像運行其他任何程序一樣運行服務可執行文件,它將作爲控制檯啓動。如果你從Visual Studio啓動它,調試器將自動附加。如果您註冊並將其作爲服務啓動,它將作爲服務正常運行而不會發生任何更改。

我發現的唯一區別是,當作爲控制檯應用程序運行時,代碼不會寫入事件日誌,您可能希望輸出通常會在該處記錄的任何內容到控制檯。

該服務的調試技術是那些在docs.microsoft.com

+0

微軟文檔正在變得越來越好,謝謝添加鏈接。 – dare2k

相關問題