Windows 10 Creators 更新 .net 4.7 System.AccessViolationException 问题

Windows 10 Creators update .net 4.7 System.AccessViolationException issue

在使用 .net 4.7 更新 Windows 10 to creators update 后,我在启动非常简单的代码时遇到了一个严重问题。

描述:进程因未处理的异常而终止。 异常信息: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 方法(无条件 returns false)。这导致 JIT 编译器将该区域视为不可访问。通常,JIT 编译器会在我们 运行 优化之前删除无法访问的代码,但添加 try/catch 区域会导致 JIT 不删除这些基本块。

如果你想防止这个问题,你可以禁用优化,禁用 get_prop 的内联或将 get_prop 方法的实现更改为:

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

我们收到了几份关于此问题的报告,我们确实准备好了修复程序,将在即将发布的更新中提供给用户。