Ссылка в принятом ответе больше недоступна (домен истек), но информация по-прежнему доступна через Wayback Machine.Я собираюсь повторить весь пост здесь, с благодарностью оригинальному автору.Если это не правильно, я уверен, что кто-то будет рядом, чтобы исправить это ...
ExecutionEngineException при вызове события PropertyChanged
Опубликовано 23 апреля 2009 г.ceiled, в (их?) блоге "Occam Says".
Если вы когда-либо видели исключение ExecutionEngineException в .NET, вы знаете, что это противно.Это даже звучит пугающе.Это ошибка, выдаваемая Environment.FailFast () - MSDN описывает ее как «исключение, которое выдается при возникновении внутренней ошибки в механизме выполнения общеязыковой среды выполнения».До прошлой ночи я видел это только один раз, когда генерировал и запускал свой собственный код сборки IL, и я делал что-то не так, например, выталкивал слишком много значений из стека или что-то в этом роде.
Однако последнееночью я получил его, когда вызывал событие PropertyChanged на своем объекте INotifyPropertyChanged, сразу после использования PropertyChangedEventManager для подписки на него.Я почесал голову ... как, черт возьми, мне удалось вызвать внутреннюю ошибку в CLR?Я перезапустил Visual Studio, перезагрузил свой компьютер, я попробовал его на других компьютерах, чтобы увидеть, не было ли это какой-то сумасшедшей коррупцией в моей системе, но это было полностью повторяемо.
Наконец, в отчаянии, я настроилПереход на исходный код .NET (что-то, что я собирался сделать какое-то время), и запуск его снова - на этот раз вместо того, чтобы показываться в строке, где я вызвал событие PropertyChanged, исключение остановилось для этого кода в WeakEventManager.cs:
bool condition = listener.ReceiveWeakEvent(managerType, sender, args);
if (!condition)
{
Invariant.Assert(condition, SR.Get("ListenerDidNotHandleEvent"), SR.Get("ListenerDidNotHandleEventDetail", new object[] { listener.GetType(), managerType }));
}
Это верно… когда ReceiveWeakEvent возвращает false (указывает, что слушатель не обработал инициируемое событие), WeakEventManager вызывает Environment.FailFast ().Это программный эквивалент людей в фильмах ужасов, которые предпочитают стрелять себе в лицо, а не превращаться в зомби и, возможно, причинить боль своим друзьям.Он записывает событие в средство просмотра событий, которое говорит: «Неустранимая системная ошибка».
Это может быть самая нелепо чрезмерно реактивная обработка ошибок, которую я когда-либо видел в своей жизни, и по какой-то причине Google полностьюбесполезен в этом вопросе.Поиск «PropertyChangedEventManager ExecutionEngineException» практически ничего не дает - единственным результатом на английском языке был 404, и в кешированной версии Google по какой-то причине не было ни одного ключевого слова.Надеюсь, это спасет кого-то от сильного разочарования, которое я испытал, когда случайно возвратил false из обработчика случайных событий где-нибудь, и мне сказали, что мой механизм выполнения стал неисправно поврежденным и будет отключен для собственной защиты.Если этот пост поможет вам, пожалуйста, сообщите мне об этом в комментариях, чтобы я знал, что мое время не было потрачено впустую.