我要調試Windows服務,但它會彈出一個錯誤信息說運行Windows服務作爲一個控制檯應用程序
無法從命令 線或調試器啓動服務。必須使用 installutil.exe安裝Windows服務 ,然後使用服務器資源管理器,Windows服務 管理工具或NET啓動 命令以 開頭。
我真的沒有關於此錯誤的任何想法.....
我要調試Windows服務,但它會彈出一個錯誤信息說運行Windows服務作爲一個控制檯應用程序
無法從命令 線或調試器啓動服務。必須使用 installutil.exe安裝Windows服務 ,然後使用服務器資源管理器,Windows服務 管理工具或NET啓動 命令以 開頭。
我真的沒有關於此錯誤的任何想法.....
前一個Windows服務可以運行,它必須「安裝」首先使用installutil。 EG:
C:\installutil -i c:\path\to\project\debug\service.exe
然後你可以打開服務列表來啓動它。 EG:
一旦開始,你可以去到Visual斯圖dio,點擊'Debug',然後點擊'Attach to Process'。
另一種技術是這一行添加到您的OnStart()方法,在服務:
System.Diagnostics.Debugger.Launch();
當你做到這一點,它會提示你選擇Visual Studio中的一個實例來調試服務。
另外,我發現在OnCommitted方法中使用下面的方法創建一個安裝程序的效果非常好:使用(ServiceController sc = new ServiceController(__ SERVICENAME __)){sc.Start();} (或者您可以按照描述手動啓動)。 –
對不起,但我無法執行此操作C:\ installutil -i c:\ path \ to \ project \ debug \ service.exe – pinki
manasareddy,當您嘗試時會發生什麼? –
您可以更改根據您是否是在調試模式下(通常是內部的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。我在這裏複製了代碼片段,因爲它贊成完整的答案,而不是可能會消失一段時間的鏈接。
因此,這將只運行myServ.Process()並退出? –
基本上。保持繁忙是你的責任。 –
我的觀點是它與運行服務不同。 –
請檢查您是否處於「DEBUG」或「RELEASE」模式。當我嘗試在「RELEASE」模式下調試服務時,出現此錯誤。當我將其改爲「DEBUG」時,一切正常。
這是在您正確安裝上述其他人建議的服務之後。
我有同樣的錯誤。試過@C。勞倫斯的解決方案。雖然我發現我的服務在服務列表中運行,但仍然出現相同的錯誤。我已經閱讀了一個建議在調試菜單中附加到進程的博客,看到我在進程列表中看不到我的服務。
我將不勝感激對此問題的可能解決方案的建議。
謝謝。
中將輸出類型設置爲控制檯應用程序,這不應該是答案。它應該是一個評論或一個新的問題(如果沒有這樣的現有問題) – Joshua
是的,問題是我在這個地方是新的,無法評論,直到我得到50分或什麼?對不起,搞砸了。無論如何感謝您的評論。 – CodeJammer
我想你需要以管理員權限運行才能連接到服務進程。您應該能夠通過管理員命令提示符使用'sc queryex <服務名稱>'來檢查PID。您也可以單擊附加到處理屏幕中的PID列標題,按PID排序。 –
爲防止發生此錯誤並允許服務在常規服務控制器之外運行,您可以檢查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
微軟文檔正在變得越來越好,謝謝添加鏈接。 – dare2k
可以發誓我解釋之一[剛看到這樣一個帖子(http://stackoverflow.com/questions/5156427/how-do-you-debug -a-windows-service) –