Windows更新破坏了在.Net 4.x中的结构体构建

3
自从2017年9月14日安装了Windows更新后,我们在发布版本中创建某些结构时出现问题。我注意到,在没有该更新的计算机上编译的代码按预期运行(“错误的开始:1.1.1990...”),但是在安装了该更新的计算机上,代码无法正常工作(“错误的开始:1.1.2000...”)。这在所有版本的.NET Framework(从4.x版本开始)中都会发生。
 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; }
        }
    }

定义“工作不正常”。症状/错误是什么? - DiskJunky
那个日期安装了哪些Windows更新? - AKX
删除项目中的bin文件夹,并重新编译。将创建新的Bin文件夹。编译器无法识别框架上的依赖关系,因此编译器不会自动更新所有对象。因此,删除bin将强制编译器完全重新编译项目。 - jdweng
这是否也会影响您的调试构建?如果是,您能否调试以查看设置错误日期的位置? - oerkelens
更新:当我在Visual Studio中启动新项目并粘贴此帖子中的代码时,它可以正常工作。但是,当我将目标框架属性切换到框架4.0时,它开始出现问题。自那以后,切换到较新的框架也无法修复该问题。 - robert guth
显示剩余2条评论
1个回答

3

我在重启我的电脑后看到了这个问题。显然是更新中的一个错误。在我的机器上,我看到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\corjit.dll,日期为 9/6/17,时间为 9:23AM CDT,版本为 4.7.2110.0。

这个错误只出现在 Release 版本且启用优化器的 x64 jitter 中。它与我以前见过的 jitter 中的大多数优化器错误都相符,而这些错误大多与处理结构体的代码相关。

不幸的是,我很难描述这个错误,代码生成太复杂了,我找到的解决方法似乎在机器码上没有足够的差异。但这通常是绕过这种优化器错误的典型方法:

using System.Runtime.CompilerServices;
...
    public DateTime From {
        [MethodImpl(MethodImplOptions.NoInlining)]
        get { return m_range.From; }
    }

其他解决方法是强制使用32位模式或退回到传统的JIT编译器。请报告这个错误,以便他们可以修复它,如果你不想花时间,我会处理它。


1
感谢您的建议和帮助,我们已经报告了这个问题。提到的属性正在工作,但我们希望它能够在整体上得到解决。 - robert guth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接