自从14.9.2017安装了Windows更新以来,我们在发布版本中创建某些结构时遇到了问题。我注意到没有更新的计算机上的编译代码按预期运行("错误的启动:1.1.1990 ..."),在安装了相关更新的计算机上,代码无法正常工作( "错误的开始:1.1.2000 ......")。从版本4.x开始,所有版本的.NET框架都会发生这种情况。
class Program
{
static void Main(string[] args)
{
DateTime start1 = new DateTime(1990, 1, 1, 6, 0, 0);
DateTime end1 = new DateTime(2000, 1, 1, 6, 0, 0);
var r2 = new DateTimeRange(start1, end1);
var r3 = new Range<DateTime>(r2.From, r2.To);
Console.WriteLine($"Wrong start: {r3.From}, correct start: {start1}");
Console.ReadLine();
}
}
public struct DateTimeRange
{
private Range<DateTime> m_range;
public DateTimeRange(DateTime from, DateTime to)
{
m_range = new Range<DateTime>(from, to);
}
public DateTime From
{
get { return m_range.From; }
}
public DateTime To
{
get { return m_range.To; }
}
}
public struct Range<T> where T : struct
{
private T m_from;
private T m_to;
public Range(T from, T to)
{
m_from = from;
m_to = to;
}
public T From
{
get { return m_from; }
}
public T To
{
get { return m_to; }
}
}
答案 0 :(得分:3)
重新启动机器后,我看到了它。肯定会像更新中的bug那样嘎嘎作响。在我的机器上,我看到C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ corjit.dll,日期为9/6/17,上午9:23 CDT,版本4.7.2110.0。
该错误特定于x64抖动,仅在启用了优化程序的Release版本中发生。它匹配我之前在抖动中看到的那种错误,过去大多数优化错误都与代码处理结构有关。
不幸的是我很难描述这个错误,代码生成太强大了,我发现的解决方法似乎并没有在机器代码中乍看之下产生足够的差异。但是,否则这是绕过这些优化器错误的典型方式:
using System.Runtime.CompilerServices;
...
public DateTime From {
[MethodImpl(MethodImplOptions.NoInlining)]
get { return m_range.From; }
}
其他解决方法是强制32位模式或回退到the legacy jitter。请report the bug以便他们修理它,如果您不想花时间让我知道,我会照顾它。