将 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/