c# - Windows 10 创意者更新.net 4.7 System.AccessViolationException 问题

标签 c# .net .net-4.7

将 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

谁知道如何避免这种情况?

最佳答案

问题是在无法访问的基本 block 上运行优化时引起的。 在您的情况下,编译器内联 get_prop 方法(无条件返回 false)。这导致 JIT 编译器将该区域视为不可访问。通常,JIT 编译器会在我们运行优化之前删除无法访问的代码,但添加 try/catch 区域会导致 JIT 不删除这些基本 block 。

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

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

我们收到了一些关于此问题的报告,并且我们已经准备好修复,并将在即将到来的更新中提供给用户。

关于c# - Windows 10 创意者更新.net 4.7 System.AccessViolationException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43518980/

相关文章:

c# - 可以将 EnvDTE.Project 转换为 VCProject

.net - 客户资料与完整

c# - 在 .NET 4.7 中使用长路径时出现 DirectoryNotFoundException

SSIS 中的 C# 脚本任务

C# 时间轴控件

javascript - React JS/Typescript 中的空合并运算符

c# - 在它的 "taking a screenshot"之前等待 UI 重绘

c# - 如何使用 ServiceBus EventData 偏移值

visual-studio-2017 - 无法选择.NET 4.7

c# - 异步函数内部的普通方法也应该是异步的吗?