无法计算表达式,因为本机帧位于调用堆栈的顶部

Tim*_*m B 5 c# windows-services

我正在创建一个简单的窗口服务,当我去调试时,我得到错误,"无法计算表达式,因为本机帧位于调用堆栈的顶部." 此外,当我在Release中构建服务并运行它时,它就会挂起.

 static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] { new MyService1() };

        ServiceBase.Run(ServicesToRun);
    }
Run Code Online (Sandbox Code Playgroud)

这就是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);
    }
Run Code Online (Sandbox Code Playgroud)

最近在ErenErsönmez的评论中添加了Internal Void Run().他的想法对于帮助调试我的逻辑非常有帮助,直到我能够完成剩下的工作.

我能够进入Native调用堆栈,它位于一个位置,76F17094 ret.现在我不知道这是什么,但也许别人会.

此外,当我启动服务并考虑将其附加到VS时,我注意到它的两个实例.一个是正​​常的.exe,另一个是.vshost.exe.当我启动其他服务时,我只看到Attach for process部分调试器中的.exe文件.这可能是因为一个是v4框架(.vshost .exe服务)而另一个是v2(单个.exe服务)框架?

我相信我得到了它的工作.似乎问题与我使用的计时器有关.我使用的原始计时器是一个System.Windows.Forms计时器.我把它切换到System.Timers.Timers,一切都开始工作了.仍然无法将VS附加到它但我仍然可以使用Internal Run()方法调试它.感谢所有的帮助nn

age*_*t-j 2

问题

此通知意味着线程当前正在执行非托管代码,因此不能用于计算表达式。

在某些情况下,您可以等待调用返回到托管代码,然后再计算表达式。不幸的是,在这种情况下,除非您关闭服务,否则这种情况不会发生。

替代

您可能会考虑重写ServiceBase.OnCustomCommand方法并在那里放置一个断点,以便可以计算表达式。

protected override void OnCustomCommand(int command)
{
   //Debugger.Break()   <- or just put a breakpoint in here.
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式调用自定义命令:

c:\>sc control YourServiceName 129
Run Code Online (Sandbox Code Playgroud)