非托管代码中的ASP Net Core 1.1和EF 6异常?

时间:2017-03-13 20:13:23

标签: c# .net entity-framework asp.net-core asp.net-core-mvc

好的,这是一个刚刚发展起来的怪异问题,对于我的生活,我不知道从哪里开始。

出于某种原因,我在EF 6中的某处遇到致命错误,但这只是在我转换为.NET Core 1.1之后才发生的。这个应用程序在ASP.Net MVC 4上没有问题。

Reason for my sleepless nights

对于搜索引擎:

  

托管调试助手' FatalExecutionEngineError' :'运行时遇到了致命错误。错误的地址是0x77c81a09,位于线程0x2520。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会损坏堆栈。'   ```

从我在网上找到的内容来看,这是一个问题 .NET的托管环境....这意味着我只是羞于无知。

第一次遇到这个错误时,一个简单的Clean和Build修复了一段时间,然后又在同一个地方再次出现。

到目前为止,我在两个地方看到了这个错误:

var vm = new ManagerLogIndexViewModel()
{
    Locations = await _db.Locations.ToListAsync(),
};

而且(虽然更复杂):

var results = await _db.InvolvedPersons
    .Where(
        x =>
            x.LastName.ToUpper().Contains(q) || x.FirstName.ToUpper().Contains(q) ||
            (x.FirstName + " " + x.LastName).ToUpper().Contains(q))
    .Select(x => new {x.FirstName, x.LastName, x.Id})
    .GroupBy(x => x.LastName + " " + x.LastName)
    .Select(x => x.FirstOrDefault())
    .ToDictionaryAsync(x => x.FirstName + " " + x.LastName, x => x.Id.ToString());

它可能与async有关吗?

还有其他实体框架调用,即使使用异步操作符,一切正常。

即使是第一个例子也在Clean and Build之后起作用。

我真的不知所措。我读过它可能与环境有关。目前,我没有其他可供测试的环境,只有我的开发机器。如果我在备用计算机上启动此操作,我将尝试稍后更新。

我在发布之前刚做了另一个测试:

如果我单步执行代码(第一个示例),一切都按预期工作。

停止。删除断点。开始。崩溃。

这让我感到困惑。

更新

好像这不会变得更加陌生,每次启动时都不会发生此错误。

我说它大约60/40支持崩溃。当它运行(并且第一个查询通过)时,我对该过程的生命周期没有任何问题。

另一次更新

看起来这是隔离到在IIS Express下运行。如果我以独立的方式运行应用程序,我就无法发生崩溃。

更多技术部分:

  • ASP.Net Core 1.1
  • .NET 4.5.2
  • Windows 7 SP1
  • EF 6.1.3

关闭修改

为了这个帖子的完整性(因为此时有几个线程),@ gregg-miskelly提供的解决方法(由@SwampyFox提交给SO)确实有效。该错误已提交给MS,应在将来的.NET Framework版本中修复。

讨论在coreclr GitHub page

进行

2 个答案:

答案 0 :(得分:14)

根据github上的OP帖子EF 6.1.3 Crashing IIS Express with FatalExecutionEngineError in ASP.Net Core MVC #10717,这是框架中的崩溃。

打开ETW GC内存跟踪会触发崩溃。

要解决此问题,您可以尝试在Visual Studio中关闭ETW GC内存跟踪。

  1. 打开工具 - >选项
  2. 输入'诊断工具'在搜索栏中
  3. 在调试时取消选中'启用诊断工具'在调试常规部分下。

答案 1 :(得分:1)

我遇到与net462和带有EF 6.1.3项目的ASP.NET 1.1相同的问题

  <PropertyGroup>
    <TargetFramework>net462</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
    <PackageReference Include="EntityFramework" Version="6.1.3" />
  </ItemGroup>

我在IIS Express中运行时收到以下异常(但不是全部):

  

托管调试助手'FatalExecutionEngineError':'运行时   遇到了致命的错误。错误的地址是   0x709a1a09,在线程0x5020上。错误代码是0xc0000005。这个错误   可能是CLR中的错误或不安全或不可验证的部分   用户代码。此错误的常见来源包括用户编组错误   对于COM-interop或PInvoke,它可能会破坏堆栈。'

如果我调用异步或同步,或者即使我从Main调用我的DbContext,也会发生这种情况:

    public static void Main(string[] args)
    {
        using (var db = new MyDbContext())
        {
            var WorkOrders = db.WorkOrders.ToList();
        }

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    }

如果我直接运行我的应用程序(在IIS Express之外),这种情况永远不会发生。

显然这仍然是一个问题。