私有方法作为程序集在调用堆栈中的第一个方法

时间:2013-04-02 08:04:27

标签: .net datetime vsto encapsulation

在客户端系统的日志中记录了以下异常。

System.ArgumentOutOfRangeException: Value to add was out of range.
Parameter name: value
  at System.DateTime.Add(Double value, Int32 scale)
  at ButtonPressed()
  at MessageEvent(MessageEventArgs e)

自定义方法非常简单

Public Sub ButtonPressed
    If mWindows.Count > 0 AndAlso mLastEvent.AddSeconds(1) > Now
        PostMessage(New IntPtr(mHwnd), 1125, UIntPtr.Zero, IntPtr.Zero)
    End If
End Sub

我很难解释如何调用这样的调用堆栈,因为DateTime.Add(Double value, Int32 scale)是一个私有方法,而不是我的代码调用。

DateTime.Now is throwing an exception似乎在多线程环境中对此进行了解释。但是我的调用堆栈上没有调用DateTime.get_Now,所以它的根本原因是否真的相同?

1 个答案:

答案 0 :(得分:2)

我怀疑JIT已经内联了AddSeconds方法,这就是全部。

例如,请考虑这个非常简单的代码:

using System;

class Test
{
    static void Main()
    {
        var max = DateTime.MaxValue;
        var oops = max.AddSeconds(1);
    }
}

在我的.NET 4.5计算机上,它生成一个堆栈跟踪:

Unhandled Exception: System.ArgumentOutOfRangeException:
   The added or subtracted value results in an un-representable DateTime.
Parameter name: value
   at System.DateTime.AddTicks(Int64 value)
   at Test.Main()

请注意缺少AddSeconds来电。现在它与您所看到的不完全相同,但这可能是由于框架版本的差异。

我建议您在方法开头记录mLastEvent - 我的猜测是您会发现它接近DateTime.MaxValue