Исключение ASP Net Core 1.1 и EF 6 в неуправляемом коде?

Хорошо, это действительно причудливая проблема, которая только что сложилась, и для жизни меня я не знаю, с чего начать.

По какой-то причине я получаю фатальную ошибку где-то в EF 6, но это произошло только после того, как я конвертировал в .NET Core 1.1. Это приложение запускалось без проблем в ASP.Net MVC 4.

Причина моих бессонных ночей

Для поисковых систем:

Помощник по удаленной отладке "FatalExecutionEngineError": 'Среда выполнения столкнулась с фатальной ошибкой. Адрес ошибки был равен 0x77c81a09, на потоке 0x2520. Код ошибки: 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях кода пользователя. Общие источники этой ошибки включают ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек. `` `

Из того, что я могу найти в Интернете, это проблема вне управляемой среды .NET. Это означает, что я просто стесняюсь невежественности.

В первый раз, когда я был поражен этой ошибкой, простая "Чистая" и "Сборка" фиксировали ее на некоторое время, затем она снова появилась в том же месте.

Я видел эту ошибку в двух местах:

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?

Существуют другие вызовы Entity Framework, где все работает нормально, даже с оператором async.

Даже первый пример работал после Clean и Build.

Я действительно в недоумении, что делать. Я читал, что это может иметь какое-то отношение к окружающей среде. На данный момент у меня нет альтернативных условий для тестирования, только моя машина dev. Я попытаюсь обновить его позже, если я закрою его на альтернативной машине.


Я только что сделал еще один тест перед публикацией:

Если я пройду через код (первый пример), все будет работать по назначению.

Стоп. Удалить точку останова. Начало. Краш.

Это подталкивает меня к стене.


Обновление

Как будто это не может стать намного более странным, эта ошибка не возникает при каждом запуске.

Я бы сказал, что около 60/40 в пользу крушения. Когда он запускается (и первый запрос проходит), у меня нет проблем для времени жизни процесса.

Другое обновление

Похоже, он изолирован от работы под IIS Express. Если я запускаю приложение автономно, я не смог выполнить сбой.


Еще несколько технических бит:

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

Закрытие Редактировать

Для полноты этой темы (поскольку в этой точке есть несколько потоков), обходной путь, предоставляемый @gregg-miskelly (и представленный SO by @SwampyFox), действительно работает. Ошибка была отправлена ​​в MS и должна быть исправлена ​​в будущей версии .NET Framework.

Обсуждение состоялось на странице coreclr GitHub

Ответы

Ответ 1

Согласно сообщению OP на github, EF 6.1. 3 Сбой IIS Express с FatalExecutionEngineError в ASP.Net Core MVС# 10717, это крах в Framework.

Сбой запускается при включении трассировки памяти ETW GC.

Чтобы обойти это, вы можете попробовать отключить трассировку памяти ETW GC в Visual Studio.

  • Открыть инструменты- > Параметры
  • Введите "Диагностические инструменты" в строке поиска
  • Снимите флажок "Включить инструменты диагностики во время отладки" в разделе "Отладка".

Ответ 2

Я испытываю ту же проблему с net462 и ASP.NET 1.1 с проектом EF 6.1.3

  <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, которые могут повредить стек.

Это происходит, если я вызываю асинхронный или синхронный или даже если я вызываю свой DbContext из Main:

    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).

По-видимому, это все еще проблема.