38

我一直试图找出更多关于这个问题的信息,但我运气不佳。我一直在阅读,应用程序不应该出现这个错误,虽然这一切都很好,但它并没有告诉我什么会导致这个错误出现。

我知道这个问题非常广泛,因为我确信这个错误可能有多种原因,所以我会尽量缩小范围。

我正在使用 VS2003 开发使用 C++.NET 的应用程序

该应用程序主要使用非托管代码和少量托管代码(由于垃圾收集器的严重干扰)。所以我认为它 95% 非托管,5% 托管

我在某处读到不稳定/错误/不正确的非托管代码可能会弄乱部分 CLR 内存,使其损坏并引发此错误。

由于 95% 的应用程序是非托管的,我不知道从哪里开始寻找。也许在托管和非托管之间交互的少数类?将数据从托管数据编组到非托管数据呢?错误的空指针会导致此故障吗?还有哪些问题会导致这种情况?数组索引超出范围?空对象呢?

任何可以提供 System.ExecutionEngine 失败的可能原因列表的信息/论文/文章将不胜感激!


根据答案,此异常可能在多种情况下引起,在问题中提及它们以获得更好的可见性。

可能的原因/情况列表:

可能的解决方法/解决方案:

4

28 回答 28

8

这不应该被太认真地对待,但我设法得到了这个例外,同时通过反思获得了一些乐趣:

typeof(IntPtr).GetField("Zero").SetValue(null, new IntPtr(666));
于 2012-04-24T16:22:34.847 回答
5

有同样的问题 - 我的错误原来是我的 C# 代码和我的 C++ 本机 dll 之间的参数不匹配。我向 C++ 函数添加了一个参数,但未能将其添加到 C# 端。

于 2010-03-19T19:15:21.853 回答
4

引用自MSDN 参考页System.ExecutionEngineException

公共语言运行库的执行引擎出现内部错误时引发的异常。这个类不能被继承。

ExecutionEngineException 没有过时的替代方案。如果您的应用程序无法继续执行,请使用 FailFast 方法。

小费

在某些情况下,以 .NET Framework 为目标的应用程序可能会在垃圾回收期间引发 ExecutionEngineException 异常,而此时应用程序或运行它的系统处于高负载状态。在这种情况下,要解决此问题,您可以通过修改应用程序的配置文件来禁用并发垃圾回收。有关详细信息,请参阅如何:禁用并发垃圾收集

于 2011-11-16T19:04:38.843 回答
4

当我的托管代码被编译为发布时,我在调用非托管库中的函数时遇到了它。编译调试时错误消失。

于 2010-12-02T14:24:28.770 回答
4

当 WCF 服务尝试返回 IList 或 IEnumerable 时,存在一个已知错误。

http://connect.microsoft.com/wcf/feedback/details/433569/wcf-throws-an-executionengineexception-when-returning-an-array-as-ilist-t

于 2010-03-02T21:09:33.480 回答
2

我最近发现使用std汇编程序中的指令设置方向标志而不在完成时清除它(cld)可能会导致此错误。我正在使用.Net 4.0。

于 2010-07-18T07:30:32.687 回答
2

老实说,我唯一一次看到这个异常是在我使用 Compuware DevPartner 工具进行一些概要分析和代码分析时。DevPartner 深入到 CLR 的核心来完成它的工作,但它充满了错误,所以把 CLR 搞砸了。我不得不重新启动我的机器(记住永远不要再点击 DevPartner 工具栏按钮)才能让一切恢复正常。

如果您没有使用 devpartner,那么您很可能有一些非托管代码正在破坏 CLR 使用的一些内存。我建议首先重新启动,然后尝试追踪您遇到的任何破坏内存的错误。查找缓冲区溢出、写入未初始化的指针以及所有其他常见问题。

于 2009-06-08T21:40:30.713 回答
2

将您的应用程序更新到 .net 4.0 或 4.5,因为该异常已过时。“注意:此 API 现在已过时。” 请参阅:http: //msdn.microsoft.com/en-us/library/system.executionengineexception (v=vs.100).aspx

于 2013-03-20T10:26:07.857 回答
2

我在开发使用 VB.NET (Visual Studio 2005) 编写的 ArcGIS 扩展时遇到了这个异常。ArcGIS 严重依赖 COM 技术,因此涉及到 .NET-COM 互操作。直到现在我还没有找到异常的原因,但我想这可能与未发布的 COM 对象实例的建立有关,因为该异常仅在软件处理几何图形和数字之后才会发生一段时间。

于 2010-03-23T20:05:32.837 回答
2

ExecutionEngineException只是在使用标准的 .NET 剪贴板调用时得到这个。我的代码是 100% 管理的。因此,.NET Framework 似乎存在问题。

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

其中数据类型是“ EnhancedMetafile”,它位于剪贴板上的格式列表中。

于 2012-08-28T13:53:50.427 回答
1

抛出的另一种情况System.ExecutionEngineException是在提供给ThreadPool.QueueUserWorkItem()函数的委托中抛出未处理的异常。

于 2013-10-10T15:25:41.647 回答
1

我在处理 WPF 应用程序时遇到了这个异常。VS 显示它是在通过NotifyPropertyChangedcall( INotifyPropertyChanged) 通知属性更改时发生的。

我觉得很奇怪,而且只发生过一次;它停止了调试会话,并且在再次运行应用程序后没有发生。

于 2012-10-12T09:56:45.750 回答
0

当我将硬盘从一台计算机移动到另一台计算机时出现此错误(win 8 自动重新安装驱动程序)但我怀疑本机生成的 exe 将无法工作。

于 2015-03-07T02:14:43.503 回答
0

我在调试使用使用 Azure 服务总线的程序集的 C# 4.0 Web 应用程序时设法得到了这个异常。这个程序集有一个错误,它会尝试永远循环以从关闭的服务总线接收消息,但异常处理程序会捕获该异常。但是,在调试代码时,它实际上杀死了 Visual Studio 2012,但出现了这个异常!是的,VS2012 是引发异常的那个。

于 2013-07-31T09:01:59.697 回答
0

只是为了添加到可能的原因列表中,我在尝试序列化包含复杂类型的 IEnumerable<> 时遇到了这个错误。

从 更改IEnumerable<>List<>解决问题。

于 2009-11-13T11:59:52.627 回答
0

在与编译它不同的版本中运行非托管代码时,我遇到了这个异常。

也许这可以帮助某人...

于 2010-06-18T13:45:24.797 回答
0

当我的 C# 模块(由使用 /CLR 构建的 C++/MFC 应用程序调用)无意中取消引用空指针时,我得到了其中一个。因此,由于“用户代码”中的错误,可能会发生异常。

凯文

于 2009-09-02T14:59:02.210 回答
0

我刚刚在使用Unity Framework编写 ac# 程序时遇到了这个异常。

我正在使用 VS 2010 和 .NET 3.5

基本上,如果您在 a 中注册一个类型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
于 2010-09-30T13:51:12.717 回答
0

我会补充一下我是如何做到的。

使用 .Net 4 代码联系人,aContract.Ensures(Contract.Result<object>() != null)将抛出此异常 IIF 您在代码合同的项目属性页面中检查合同失败时断言。但是,禁用此复选框不会禁用检查。您会收到预期的“发布条件失败消息”。

于 2011-07-07T15:00:30.487 回答
0

我发生了这种情况,这是因为我::FreeLibrary()使用同一个 DLL HANDLE 多次调用。(DLL 是一个托管 C++ dll:一个托管 C++ 对某些 C# 功能的包装器)

于 2010-08-02T05:13:41.767 回答
0

使用错误的编组会导致我出现此异常。我有一个纯 C *.dll 可以使用;我使用 DllImport 在 C# 中编写了一个包装器;然后我使用封送处理来释放字符串参数来填充 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美分。:-)

于 2012-01-05T17:31:11.480 回答
0

使用外部查看器查看 pdf 文件时出现此异常。我认为观众本身就是万恶之源。显然,它必须是 .NET 框架之外的东西。

于 2011-11-29T14:12:30.607 回答
0

在我看来,在纯托管 WPF 应用程序中遇到这个问题是非常无辜的。我在要显示或隐藏的网格中有一个控件,因此我将其可见性设置为 Visibility.Collapsed 或 Visibility.Visible。它开始崩溃。我按下一个按钮,它被设置为可见并且看起来很好。我按下另一个按钮并将其设置为折叠和繁荣 - 大丑陋的错误。没有什么特别的或不寻常的。这是使用4.5。很奇怪。当我查看错误数据时,它显示 System.Collections.EmptyReadOnlyDictionaryInternal。

于 2015-05-08T14:32:38.913 回答
0

我在使用 VS2010 返回 FirstOrDefault 的常规 LINQ 查询中收到此错误

于 2015-05-11T13:56:27.650 回答
0

使用 VS2015 ASP.NET Framework 4.5 我只需要重新构建并再次运行。

于 2016-03-01T21:15:13.880 回答
0
  1. 创建新的 Web 表单应用程序

  2. 打开任何页面(比如说 Default.aspx)

  3. 将 GridView 添加到表单

  4. 单击 GridView,然后单击小箭头(右上角)。当我单击“编辑列”或“添加新列”或数据源 > 新数据源时,Visual Studio 2015 崩溃并在 mscorlib.dll 中出现 System.ExecutionEngineException

于 2016-10-07T11:02:37.493 回答
0

在我的项目中,我刚刚发现使用混淆的 DLL 可能是造成这种情况的原因。

这是导致问题的设置:

  • Visual Studio 启动项目生成一个 C# DLL。它设置为运行一个外部程序,该程序将加载所述 DLL + 其他一些。

  • 外部程序与我们上次构建的各种 .NET DLL 一起位于 Program Files 下。

  • 该构建包括混淆 DLL(使用 ConfuserEX,但如果以相同方式混淆,任何其他混淆工具可能会导致相同的问题)。

  • 在运行时,我们会立即收到一条ExecutionEngineException(前面是“托管调试助手'FatalExecutionEngineError'检测到问题......”消息)。

  • 此时查看 Visual Studio 模块,您可以看到异常中记录的 DLL 是从 Program Files 加载的——例如,它是被加载的混淆 DLL。

用非混淆的等效项替换任何混淆的 DLL 会消除异常。

让我特别沮丧的是为什么混淆会导致此异常,但我怀疑尝试附加的调试器无法对程序集进行逆向工程,就像您无法通过任何正常方式轻松反编译混淆工具一样。这是一个运行CTRL+F5(没有附加调试器)不会有问题的情况。

于 2021-06-02T16:38:45.653 回答
0

我在 .NET Framework 3.5 WPF 应用程序中遇到此异常。

只要在窗口事件Close中调用该方法,就会发生异常。Loaded这也发生在准系统窗口中。

但是,仅当我在视图中设置属性时才会发生SizeToContent="WidthAndHeight"异常xaml。删除此属性可解决此问题。

我也在使用 MVVM Light 库。但是,即使在为此 WPF 窗口删除对此库的引用后,也会发生异常。

于 2020-12-03T14:55:46.963 回答