gpt4 book ai didi

C# 表达式 - FatalExecutionEngineError

转载 作者:太空狗 更新时间:2023-10-29 17:53:26 30 4
gpt4 key购买 nike

今天我正在调试我的一些代码,这些代码构建了一些 ExpressionTrees,将它们编译为可调用的委托(delegate),然后在需要时调用它们。在执行此操作时,我遇到了 FatalExecutionEngineError 单步执行代码:

FatalExecutionEngineError

起初我有点震惊,因为我不知道我的表情可能有什么问题,它们看起来都很好。然后我发现只有在以下情况下才会出现这种情况:

  • Method A 是一个被调用并生成 ExpressionTree 的静态方法,它可能包含 Expression.Call()Method A 再次。因此,在我为 ExpressionTree 编译 Lambda 之后,如果我从该方法中调用它,生成的委托(delegate)(我们称之为 Method B)可能会导致递归...(Method A -> [生成]方法 B -> 方法 A).

  • ...这在我的场景中是完全可能的。如上所述,我正在调试这段代码,所以我在方法A中设置了一个断点。

  • 方法 A 第一次被常规代码调用时,断点照常命中。调用方法B时,断点第二次下,一切正常。

  • 但是当我跳过最后一行离开与调试器的第二次调用时,FatalExecutionEngineError 发生了。

如果我在不调试的情况下运行代码,或者不进入对方法 A 的递归调用,或者如果我不跨过方法的最后一行,则不会出现问题并且我的表达式代码按预期执行。

我无法确定这是 VS-Debugger 还是 .NET Framework 中的错误,或者如果我做了一些非常非常错误的事情,只有在调试相关行时才会出现。

这是一个非常简单的示例代码,您可以开箱即用。我正在使用 Visual Studio 2013 Prof Update 4 和 .NET 4.5.1。只需在 DoSomething() 中设置断点并尝试单步执行到最后 - 如果可以的话 ;)

任何人都可以确认错误,或者我的表达式格式不正确吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ExpressionProblem
{
public class MainClass
{
public static void DoSomething(bool stop)
{
var method = typeof(MainClass).GetMethod(
"DoSomething",
BindingFlags.Public | BindingFlags.Static,
Type.DefaultBinder,
new Type[] { typeof(bool) },
null);

var expParam = Expression.Parameter(typeof(bool), "stop");
var expCall = Expression.Call(null, method, expParam);
var lambda = Expression.Lambda(expCall, expParam);
var @delegate = lambda.Compile();
if(!stop)
{
@delegate.DynamicInvoke(true);
}
}

public static void Main(string[] args)
{
DoSomething(false);
}
}
}

最佳答案

您的重现代码非常棒,它可以可靠地运行。它高度特定于 32 位代码的 v4 调试引擎,它不会出现在 v2 引擎或 64 位调试器引擎中。新旧v4引擎都有这个问题。

当我调试调试器时,我没有看到太多可识别的东西,失败的代码位于 mscorlib.dll 中,带有显式throw。不熟悉,我看到一些关于名为 ILTree 的非托管类的提示。不是 Microsoft 与我们分享的东西,它不存在于引用源、SSCLI20 或 CoreCLR 源代码中。

这是微软要担心的事情。通过 connect.microsoft.com 报告错误。这个 SO 问题的链接应该足以记录它。如果您不想花时间去做,请告诉我,我会处理。

与此同时,您确实有一个不错的解决方法可以继续进行,只需通过移除抖动强制让您的程序在 64 位模式下运行。 Project + Properties,Build 选项卡,取消选中“Prefer 32-bit”选项并为 Platform target 选择 AnyCPU。当您收到 Microsoft 的回复时,请跟进。

关于C# 表达式 - FatalExecutionEngineError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28722360/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com