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

问题描述:

将Windows 10更新为使用.net 4.7创建者更新后,我在启动非常简单的代码时遇到了一个严重问题。Windows 10 Creators更新.net 4.7 System.AccessViolationException问题

描述:由于未处理的异常而终止进程。 异常信息: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

任何人知道如何避免这种情况?

+0

请注意 - 这可以在visual studio下运行,并且不在应用程序中运行。 – Andrew

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

如果你想阻止你可以禁用优化问题,禁用GET_PROP的内联或改变GET_PROP方法的实现是:

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

我们有一对夫妇的这一问题的报告,我们确实已经准备好了一个修复程序,它将在即将到来的更新中提供给用户。

+0

任何意见,如何我们可以防止像这样下载到我们的机器可怕的错误,赞赏。并且考虑到这是如何不可知的。 –

+0

感谢Brian澄清!我们有大的解决方案,只有一个地方失败。最初该属性有一些条件编译,并在某些情况下返回false。 – Andrew

+0

@Brian,当这个问题将被修复,以及补丁将如何提供给我们? – Graviton