Подтвердить что ты не робот

Ошибка System.ExecutionEngineException

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

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

Я работаю в VS2003, разрабатывая приложение, использующее С++. NET

Приложение использует в основном неуправляемый код и мало управляемый код (из-за сильных помех сборщиком мусора). Поэтому я бы оценил его на 95% неуправляемых, 5% удалось

Я где-то читал, что неустойчивый/багги/неправильный неуправляемый код может испортить части памяти CLR, которые он повреждает и бросает эту ошибку.

Поскольку 95% приложений неуправляемы, я не уверен, с чего начать искать. Может быть, несколько классов, которые взаимодействуют между управляемыми и неуправляемыми? Как насчет сортировки данных из управляемых до неуправляемых? Может ли неправильный нулевой указатель вызвать этот сбой? Какие другие проблемы могут вызвать это? Индекс массива за пределами границ? Как насчет нулевого объекта?

Любая информация/статья/статья, которые могут дать хороший список возможных причин сбоя System.ExecutionEngine, будут оценены!


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

Список возможных причин/сценариев -

Возможные обходные пути/решения -

4b9b3361

Ответ 1

Это не следует воспринимать слишком серьезно, но мне удалось получить это исключение, имея некоторое удовольствие с отражением:

typeof(IntPtr).GetField("Zero").SetValue(null, new IntPtr(666));

Ответ 2

Имела ту же проблему - моя ошибка оказалась несоответствием аргумента между моим кодом С# и моей родной dll С++. Я добавил аргумент функции С++ и не смог добавить его на сторону С#.

Ответ 3

Я столкнулся с этим при вызове функции в неуправляемой библиотеке, когда мой управляемый код был скомпилирован для выпуска. Ошибка при компиляции для отладки.

Ответ 4

Цитата из справочной страницы MSDN для System.ExecutionEngineException:

Исключение, которое возникает при наличии внутренней ошибки в механизме выполнения среды выполнения общего языка. Этот класс нельзя унаследовать.

Существует не устаревшая альтернатива ExecutionEngineException. Если дальнейшее выполнение вашего приложения не может быть поддержано, используйте метод FailFast.

Совет

В некоторых случаях приложение, предназначенное для .NET Framework, может вызывать исключение ExecutionEngineException во время сбора мусора, когда приложение или система, на которых он запущен, находятся под большой нагрузкой. В этом случае, чтобы обойти эту проблему, вы можете отключить одновременную сборку мусора, изменив файл конфигурации приложения. Для получения дополнительной информации см. Как отключить параллельную сборку мусора.

Ответ 6

Честно говоря, единственный раз, когда я когда-либо видел это исключение, я использовал инструменты Compuware DevPartner для анализа профилей и кода. DevPartner зацепляется глубоко в ядре CLR, чтобы он работал, но он полон ошибок, поэтому винты CLR вверх. Мне пришлось перезагрузить мою машину (и не забудьте никогда больше не нажимать кнопки панели инструментов DevPartner), чтобы все могло вернуться к нормальной работе.

Если вы не используете devpartner, у вас, скорее всего, есть неуправляемый код, который уничтожает некоторую память, используемую CLR. Я бы посоветовал сначала выполнить перезагрузку, а затем попытаться отследить, какая у вас ошибка, которая уничтожает память. Посмотрите на переполнение буфера, написание неинициализированных указателей и всех других обычных подозреваемых.

Ответ 7

Хотя этот поток уже довольно старый, я расскажу о своем собственном инциденте с этим исключением. Я столкнулся с этим при разработке расширения ArcGIS, написанного на VB.NET(Visual Studio 2005). ArcGIS в значительной степени полагается на технологию COM, поэтому задействован .NET-COM. Я до сих пор не нашел причину исключения, но я полагаю, что это может быть связано с наращиванием неиспользуемых экземпляров COM-объекта, поскольку исключение происходит только после того, как программное обеспечение хрустет геометрии и номера для некоторое время.

Ответ 8

Недавно я обнаружил, что использование инструкции std в ассемблере для установки флага направления без ее очистки после завершения (cld) может вызвать эту ошибку. Я использую .Net 4.0.

Ответ 9

Я получаю этот ExecutionEngineException, когда просто использую стандартные вызовы .NET Clipboard. Мой код управляется на 100%. Таким образом, кажется, что .NET Framework имеет проблемы.

PastedData = Clipboard.GetDataObject();
object imageObj = PastedData.GetData(dataType);

где тип данных "EnhancedMetafile", который был в списке форматов в буфере обмена.

Ответ 11

Я только что встретил это исключение, работая над приложением WPF. VS показал, что это произошло, уведомив изменение свойства через вызов NotifyPropertyChanged (INotifyPropertyChanged).

Мне очень странно, и это случалось только один раз; он остановил сеанс отладки и не повторился после запуска приложения.

Ответ 12

Еще один случай, когда бросается System.ExecutionEngineException, - это когда необработанное исключение передается делегату, предоставленному функции ThreadPool.QueueUserWorkItem().

Ответ 13

Я получил один из них, когда мой С# -модуль (вызванный приложением С++/MFC, созданный с /CLR ) случайно удалил нулевой указатель. Таким образом, исключение может возникнуть из-за ошибки в "коде пользователя".

Кевин

Ответ 14

Чтобы добавить к списку возможных причин, у меня была эта ошибка при попытке сериализации IEnumerable < > , содержащего сложный тип.

Изменение с IEnumerable<> до List<> устраняет проблему.

Ответ 15

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

Может быть, это помогает кому-то...

Ответ 16

У меня это произошло, и это произошло потому, что я несколько раз звонил ::FreeLibrary() с той же самой программой DLL. (DLL - это управляемая С++ dll: управляемая С++-оболочка над некоторыми функциями С#)

Ответ 17

Я только что встретил это исключение, написав программу С#, используя Unity Framework.

Я использую VS 2010 и .NET 3.5

В принципе, если вы зарегистрируете тип в UnityContainer:

container.RegisterType<IAClass, AClass>();

но AClass не имеет конструктора, который не принимает аргументов

class AClass : IAClass
{
   private int a;
   public in A { get { return a; } }
   public AClass(int a)
   {
       this.a = a;
   }
}

тогда, когда вы приступите к созданию экземпляра класса, вы получите System.ExecutionEngineException

IAClass A = container.Resolve<IAClass>(); //throws System.ExecutionEngineException

Ответ 18

Я добавлю, как я ударил это.

Используя контакты кода .Net 4, a Contract.Ensures(Contract.Result<object>() != null) выкинет это исключение. IIF у вас есть Assert on Check Fendure check на странице свойств проекта для Code Contracts. Однако отключение этого флажка не отключает проверку. Вы получаете ожидаемое сообщение об ошибке после сообщения.

Ответ 19

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

Ответ 20

Использование неправильного маршалинга вызывает это исключение. У меня был чистый C *.dll для использования; Я пишу обертку вокруг него на С#, используя DllImport; то я использовал маршалинг, чтобы выпустить строковые параметры для заполнения StringBuilder, например:

    [DllImport("old.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Ansi)]
    public static extern UInt32 GetMessage([MarshalAs(UnmanagedType.LPStr)] out StringBuilder message);

Использование UnmanagedType.LPStr вызывает это исключение; используя UnmanagedType.BStr, правый строковый маршал в этом случае решил мне проблему. Только мои 2 цента.: -)

Ответ 21

Мне удалось получить это исключение во время отладки веб-приложения С# 4.0, которое использует сборку, использующую служебную шину Azure. У этой сборки есть ошибка, в которой она попытается зациклиться навсегда, чтобы получить сообщение от закрытого сервисного шина, но обработчик исключений фиксирует это исключение. Однако, отлаживая код, он фактически убил Visual Studio 2012 с этим исключением! Да, VS2012 выбрал исключение.

Ответ 22

Я получил эту ошибку, когда я переместил жесткий диск с одного компьютера на другой (автоматически выиграл 8 драйверов), но я подозреваю, что родные gened exes не будут работать.

Ответ 23

Получение этой проблемы в чистом управляемом приложении WPF в довольно невинной ситуации мне кажется. У меня есть элемент управления в сетке, который я хочу отобразить или скрыть, поэтому я устанавливаю его видимость на Visibility.Collapsed или Visibility.Visible. Он начинает рушиться. Я нажимаю кнопку, и она становится видимой и выглядит просто отлично. Я нажимаю еще одну кнопку и устанавливаю ее в рухнувший и стрела - большую уродливую ошибку. Ничего необычного или необычного. Это использует 4.5. Очень странно. Когда я смотрю на данные для ошибки, он говорит System.Collections.EmptyReadOnlyDictionaryInternal.

Ответ 24

Я получаю эту ошибку в регулярном запросе LINQ, где я возвращаю FirstOrDefault с помощью VS2010

Ответ 25

Использование VS2015 ASP.NET Framework 4.5 Мне просто пришлось перестроить и запустить снова.

Ответ 26

  • Создание нового приложения Web Forms

  • Откройте любую страницу (скажем, Default.aspx)

  • Добавить GridView в форму

  • Нажмите на GridView, затем на маленькую стрелку (верхний правый угол). Когда я нажимаю "Редактировать столбцы" или "Добавить новый столбец" или "Источник данных" > "Новый источник данных", Visual Studio 2015 вылетает из System.ExecutionEngineException в файле mscorlib.dll