我在C#(4.0)中创建了一个Windows服务,并尝试在命令行中使用installutil工具安装它。但是我得到了一个例外。我设法找出我的代码的哪个部分导致异常 - 使用一些糟糕的日志记录,但不管怎样 - 但现在我想了解原因。所以我想要做的是调试Windows服务的安装。
我知道如何调试服务本身,但在这里,我想调试服务中Installer.Install(IDictionary stateSaver)
方法的内容。
我尝试将调试器附加到cmd.exe进程,但它显然不起作用。我还想将调试器附加到installutil进程,但我不知道如何做到这一点。
我看过这篇文章:How do you debug a windows service that is being installed?和其他几个人,但在这种情况下,出于某种原因,这家伙似乎已经在services.msc中提供了他的服务,这不是我的情况。
我怎样才能做到这一点?
答案 0 :(得分:11)
您可以在安装程序代码中添加Debugger.Break();
语句,它应该为您启动调试器。
答案 1 :(得分:1)
如果上述方法不起作用,我发现此过程也有效。基本上,您在调试模式下编译并安装服务(我通过命令行使用了installutil.exe)。在代码中,您弹出一个带有进程ID的消息框。启动工作室的第二个实例,将其附加到该进程并进行调试。消息框暂停以允许设置。进程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
....