2012-02-29 44 views
2

我在C#(4.0)中創建了一個Windows服務,並試圖在命令行中使用installutil工具進行安裝。但是我得到一個例外。我設法找出我的代碼的哪部分導致異常 - 使用一些糟糕的日誌記錄,但是什麼 - 但現在我想明白爲什麼。所以我想要做的是調試我的Windows服務的安裝。如何調試自定義Windows服務的安裝?

我知道如何調試服務本身,但在這裏,我想調試我的Installer.Install(IDictionary stateSaver)方法在服務中的內容。

我試圖將調試器附加到cmd.exe過程,但它顯然不工作。我也在考慮將調試器附加到installutil進程,但我不知道如何做到這一點。

我看過這篇文章:How do you debug a windows service that is being installed?和其他幾個人,但在這種情況下,出於某種原因,這傢伙似乎有他的服務已在services.msc這不是我的情況。

我該如何做到這一點?

+0

究竟是在安裝Windows服務你得到的例外呢? – abhilash 2012-02-29 11:46:40

+0

@ABKolan我在這個構造函數的一個對象上的一個'NullReferenceException'引發的類的靜態構造函數上使用(和我創建的)的'TypeInitializerException'。該對象與我創建的一些自定義配置類有關。奇怪的是,這段代碼也被另一個服務使用,並且一切正常。這就是我想要調試安裝過程的原因。 – Guillaume 2012-02-29 11:50:06

+0

使用http://stackoverflow.com/a/9498566/64497 – abhilash 2012-02-29 11:52:55

回答

10

您可以在安裝程序代碼中放入Debugger.Break();語句,並且它應該爲您啓動調試程序。

+0

中的解決方案是的,當然......!謝謝! – Guillaume 2012-02-29 12:11:42

+0

對我來說:.net框架安裝實用程序已停止工作.. – sotn 2017-02-02 06:48:46

+0

@sotn你可以問一個新的問題來獲得幫助。請記住包括您得到的任何錯誤。 – 2017-02-02 09:20:47

1

如果上述不起作用,我發現這個過程也起作用。基本上,你在調試模式下編譯並安裝服務(我通過命令行使用了installutil.exe)。在代碼中,彈出一個包含進程ID的消息框。啓動studio的第二個實例,將其附加到該進程並進行調試。消息框將其暫停以允許設置。進程ID並不重要,它的名稱爲InstallUtil.exe。我通常在消息框後面放一個Debug.Break(),以保證它輸入代碼。

using System.Windows.Forms; 
using System.Diagnostics; 

... 

#if DEBUG 
int processId = Process.GetCurrentProcess().Id; 
string message = string.Format("Please attach the debugger (elevated on Vista or Win 7) to process [{0}].", processId); 
MessageBox.Show(message, "Debug"); 
#endif 

.... 

How to debug the installation of a custom windows service

+0

這幫了我。我用'#if DEBUG'''System.Windows.MessageBox.Show(「現在附加調試器」);#''endif'來使用WPF。在VS Attach to Process對話框中找到InstallUtil進程非常簡單。這樣你就不必添加任何額外的'using'語句。 – 2017-04-11 22:38:12