我正在创建一个简单的窗口服务,当我去调试时,我收到错误消息“无法评估表达式,因为本机框架位于调用堆栈的顶部。”。此外,当我在 Release 中构建服务并运行它时,它只是挂起。
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyService1() };
ServiceBase.Run(ServicesToRun);
}
这就是 Program.cs 文件中的所有内容,它通常挂在 ServiceBase.Run(ServicesToRun) 行上。
我能够找到的所有内容都只与未评估的表达式有关,因为代码已优化或必须处理 asp.net 和 response.redirect。
服务代码。
public TruckRateClearService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
tmrProcess.Enabled = true;
}
protected override void OnCustomCommand(int command)
{
base.OnCustomCommand(command);
if (command == 129)
{
OnStart(null);
}
}
protected override void OnStop()
{
tmrProcess.Enabled = false;
}
private void tmrProcess_Tick(object sender, EventArgs e)
{
tmrProcess.Enabled = false;
try
{
eventLog.WriteEntry("Clearing Truck Rates Start" + DateTime.Now.ToString());
TruckRateClearingAgent.Process();
eventLog.WriteEntry("Clearing Truck Rates Finished" + DateTime.Now.ToString());
}
catch (Exception ex)
{
eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
}
tmrProcess.Enabled = true;
}
internal void Run()
{
tmrProcess_Tick(tmrProcess, null);
}
最近在 Eren Ersönmez 的评论中添加了 Internal Void Run()。他的想法对帮助调试我的逻辑非常有帮助,直到我弄清楚其余部分。
我能够进入本机调用堆栈,它位于一个位置,76F17094 ret。现在我不知道这是什么,但也许其他人会。
此外,当我启动服务并考虑将其附加到 VS 时,我注意到它的两个实例。一个是普通的 .exe,另一个是 .vshost.exe。当我启动其他服务时,我只在 Attach to process 调试器的一部分中看到 .exe 文件。这可能是因为一个在 v4 框架(.vshost .exe 服务)上,另一个在 v2(单个 .exe 服务)框架上?
我相信我得到了它的工作。看来问题出在我使用的计时器上。我使用的原始计时器是 System.Windows.Forms 计时器。我将它切换到 System.Timers.Timers 并且一切都重新开始工作。仍然无法将 VS 附加到它,但我仍然可以使用 Internal Run() 方法对其进行调试。感谢所有帮助nn