Windows 10创建者更新.NET 4.7 System.AccessviolationException问题



在将Windows 10更新为创建者使用.NET 4.7更新后,我对启动非常简单的代码有一个关键问题。

描述:由于未手持的例外,该过程被终止。异常信息:System.AccessviolationException

class Program
{
        private int? m_bool;
        private bool prop {get{ return false;}}
        void test()
        {
            //nothing
        }
        private object Test()
        {
            if (prop)
            {                    
                try
                {
                    test();
                }
                catch (Exception) {}
                m_bool = 1;                    
            }
            return null;
        }
        static void Main(string[] args)
        {
            new Program().Test();
        }
}

似乎类似的问题是https://github.com/dotnet/coreclr/issues/10826

任何人都知道如何避免?

当优化在无法到达的基本块上运行时,问题是引起的。在您的情况下,编译器插入了get_prop方法(无条件返回false(。这导致JIT编译器将该地区视为无法达到的。通常,JIT编译器在运行优化之前删除了无法到达的代码,但是添加尝试/捕获区域会导致JIT不删除这些基本块。

如果要防止问题,可以禁用优化,禁用get_prop的内部或更改get_prop方法的实现为:

    static bool s_alwaysFalse = false;
    private bool prop {get{ return s_alwaysFalse;}}

我们已经有几个有关此问题的报告,我们确实准备了一个修复程序,并将在即将到来的更新中提供给用户。

相关内容

最新更新