我正在使用Microsoft Log Parser在Windows服务中。该程序在常规网页中运行正常,但当我将代码放入Windows服务中时,它不起作用。我在Windows服务中放置了断点,但当我运行代码时,程序并没有停在断点处。因此,在排除故障的过程中,我已经将问题缩小到了Log Parser软件和Linq。所以,Linq或Log Parser软件可能是造成问题的原因。你们有什么想法吗?
我正在使用Microsoft Log Parser在Windows服务中。该程序在常规网页中运行正常,但当我将代码放入Windows服务中时,它不起作用。我在Windows服务中放置了断点,但当我运行代码时,程序并没有停在断点处。因此,在排除故障的过程中,我已经将问题缩小到了Log Parser软件和Linq。所以,Linq或Log Parser软件可能是造成问题的原因。你们有什么想法吗?
您需要直接将调试器附加到Windows服务。这可能会有所帮助:http://msdn.microsoft.com/en-us/library/7a50syb3%28VS.80%29.aspx。
您想要调试OnStart方法吗?如果是这样,您可以使用System.Diagnostics.Debugger.Launch()
或System.Diagnostics.Debugger.Break()
方法,在on start方法运行时有机会附加调试器,否则您将始终无法及时附加调试器。
我过去以许多方式完成这项任务,具体取决于程序运行方式。我认为最简单的方法是在Debugger.Launch()周围使用一个#if DEBUG 预处理器指令, 这样当你构建项目并对其进行优化时,Debugger.Launch()调用将不会编译到程序集中。
我们还有一种方法是使用System.Windows.Forms.MessageBox.Show("attach"),它允许我们在“附加”对话框显示时手动附加到调试器。
最后一种方式是我不喜欢的方式,那就是根据传入的命令行参数更改服务的行为。基本上,当触发特定的参数时,选择不使用ServiceBase.Run启动服务,而是调用一个封装了服务行为/主要功能的类。
Environment.UserInteractive
。 - Marc Gravell