System.ExecutionEngineException失败

时间:2009-06-08 21:08:48

标签: .net exception execution

我一直在努力寻找更多关于这个问题的信息,而且我没有太多运气。我一直在阅读应用程序不应该出现此错误,虽然这一切都很好和花花公子,但它并没有告诉我什么可能导致出现此错误。

我知道这个问题非常广泛,因为我确信这个错误可能有多种原因,所以我会尝试将其缩小一点。

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

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

我在某处读过不稳定/错误/错误的非托管代码会弄乱部分CLR内存,导致它损坏并抛出此错误。

由于95%的应用程序是不受管理的,我不知道从哪里开始查找。 也许在托管和非托管之间进行交互的几个类? 如何将数据从托管编组到非托管? 错误的空指针会导致此失败吗? 还有什么其他问题可以导致数组索引超出范围?那么Null对象呢?

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


根据答案,可以在多个场景中引起此异常,提及htem以获得更好的可见性。

可能的原因/情景清单 -

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

28 个答案:

答案 0 :(得分:6)

这不应该太认真,但我设法得到这个例外,同时享受反思的乐趣:

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

答案 3 :(得分:4)

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

答案 4 :(得分:4)

引自MSDN reference page for System.ExecutionEngineException

  

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

     

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

     

提示

     

在某些情况下,当应用程序或运行它的系统负载很重时,以.NET Framework为目标的应用程序可能会在垃圾回收期间抛出ExecutionEngineException异常。在这种情况下,要解决此问题,可以通过修改应用程序的配置文件来禁用并发垃圾回收。有关详细信息,请参阅How to: Disable Concurrent Garbage Collection

答案 5 :(得分:2)

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

答案 6 :(得分:2)

虽然这个帖子到现在已经很老了,但我会用这个例子提到我自己的事件。在开发使用VB.NET(Visual Studio 2005)编写的ArcGIS扩展时,我遇到过它。 ArcGIS严重依赖于COM技术,因此涉及.NET-COM互操作。到目前为止我还没有找到异常的原因,但我想它可能与未发布的COM对象实例的构建有关,因为只有在软件处理几何和数字之后才会发生异常。一段时间。

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

老实说,我见过这个例外的唯一一次是当我使用Compuware DevPartner工具进行一些分析和代码分析时。 DevPartner深深陷入了CLR的核心,可以完成它的工作,但它充满了bug,因此将CLR搞砸了。 我不得不重新启动我的机器(并且记得再也不要再点击DevPartner工具栏按钮)让事情恢复正常。

如果您没有使用devpartner,那么您很可能有一些非托管代码会破坏CLR使用的一些内存。 我建议先重新启动,然后尝试追踪你所有的错误,这会破坏内存。寻找缓冲区溢出,写入未初始化的指针以及所有其他常见的嫌疑人。

答案 10 :(得分:1)

抛出System.ExecutionEngineException时的又一个案例是在提供给ThreadPool.QueueUserWorkItem()函数的委托中抛出未处理的异常时。

答案 11 :(得分:1)

我在处理WPF应用程序时遇到过这个异常。 VS显示通过NotifyPropertyChanged调用(INotifyPropertyChanged)通知属性更改时发生了这种情况。

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

当我将硬盘从一台计算机移动到另一台计算机时,我遇到了这个错误(自动赢得8个重新安装的驱动程序),但我怀疑原生的exes将不起作用。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

  1. 创建新的Web表单应用程序

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

  3. 将GridView添加到表单

  4. 单击GridView,然后单击小箭头(右上角)。当我点击"编辑列"或"添加新列"或数据源>新数据源,Visual Studio 2015与mscorlib.dll中的System.ExecutionEngineException崩溃

答案 17 :(得分:0)

.NET Framework 3.5 WPF应用程序中出现此异常。

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

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

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

答案 18 :(得分:0)

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

这是导致问题的设置:

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

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

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

  • 在运行时,我们会立即收到 ExecutionEngineException(前面是“Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem...”消息)。

  • 此时查看 Visual Studio 模块,您可以看到异常中指出的 DLL 正在从程序文件加载 - 例如,它是正在加载的混淆 DLL。

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

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

答案 19 :(得分:0)

使用错误的编组会导致我出现此异常。 我有一个纯粹的C * .dll可供使用;我用Cll编写了一个包装器,使用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美分。 : - )

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

我将添加如何点击此内容。

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

答案 23 :(得分:0)

我在使用Unity Framework编写c#程序时遇到此异常。

我正在使用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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

我在不同版本中运行非托管代码时遇到此异常,而不是我编译它。

也许这有助于某人...

答案 26 :(得分:0)

只是要添加到可能原因列表中,我在尝试序列化IEnumerable&lt;&gt;时遇到此错误包含复杂类型。

IEnumerable<>更改为List<>解决了问题。

答案 27 :(得分:0)

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

凯文