繁体   English   中英

“表达式计算器中的内部错误”

[英]"Internal error in the expression evaluator"

我在 visual studio 2015 的表达式求值器中遇到了一个问题,上面写着“表达式求值器内部错误”,经过一些调查我发现这是由使用反射加载的程序集引起的。 该程序集不会抛出任何异常,但在那之后,vs exp 评估器将失败。 这不是我加载的唯一程序集,有一些工作良好的程序集不会影响评估程序。

为了解决这个问题,我必须选中“菜单 > 选项 > 调试 > 使用托管兼容模式”,但这会禁用“编辑并继续”功能,我该怎么办?

原因程序集的属性:

  • 它的名称与主组件相同(我更改了它的名称但没有任何反应)
  • 我所有的项目都使用 dotNet 4.5
  • 所有根命名空间都相同(所有程序集都是如此)

谢谢!

这听起来像是表达式计算器中的错误。 为了更好的解决方法,不要选中“使用托管兼容模式”,而是选中“使用旧版 C# 和 VB 表达式计算器”。 这应该使您能够继续使用“编辑并继续”以及在最近几个版本中添加的其他功能。

关于“表达式求值器的内部错误”,您能否通过“帮助”->“发送反馈”->“报告问题”打开一个问题? 这将帮助我们在未来的版本中解决这个问题。

只是扩展了Patrick Nelson提供的解决方案 对于查询到的Visual Studio 2015+,步骤如下。

如果您此时正在调试,则此选项将不可用。 停止调试器。

转到工具- >选项

VS 选项

在 Options 下选择Debug -> General并向下滚动找到...legacy C# expression..选项:

VS 选项调试遗留选项

此处提供了更多信息:

切换到托管兼容模式

注意:切换到传统模式也会出现一些严重的缺陷。 特别是已实现接口的运行时反射几乎变得不可能或极其不便。 还有其他反射方法会抛出错误。

我终于弄清楚是什么在我的 Visual Studio 中造成了这个问题!

快速修复是从“Documents/Visual Studio xx/Visualizers”文件夹中删除调试对象收藏夹并重新启动 Visual Studio。

在此处输入图像描述 当您在调试器中“固定”一个变量时,Visual Studio 会为其保存一个“最喜欢的”json 对象。

Visual Studio 中似乎存在一个错误,该错误破坏了一些本质上是动态的子变量的“收藏夹” (虽然不能完全确定条件)。 在此处输入图像描述

对我来说,选中“使用托管兼容模式”选项有效。 将鼠标悬停在变量而不是属性和值上时,我也看到了问号

我通过以下方式简单地重置我的 visual studio 设置解决了这个问题:to Tools->Import and Export Settings 并选择重置为默认设置

我在 VS2019 上遇到了同样的问题。 我最终删除了我的 Documents/Visual Studio 2019 文件夹。 希望有一天这可以帮助某人。 花了我一天的时间。

附言。 可能不需要删除所有项目,当然也不需要删除您的项目(如果它们在其中),但就我而言,其中的所有内容都是由 VS 自动生成的。

我当然尝试了这里提到的所有解决方案,甚至重新安装 VS 也没有用。 将类重构为另一个名称是“触发器”,这让我认为必须有一些缓存,尽管清除符号等没有用。

在我的例子中,我试图在 List<> 上评估 lambda 表达式并出现这样的错误(“表达式评估器中的内部错误”)。 我使用的是 VS2015,因此允许使用 lambda 表达式。 原来表达式计算器缺少 Linq 库。 我加了

using System.Linq;

到我现在的班级,瞧。 Lambda 进行了评估。

我在发布模式而不是调试模式下调试时遇到了“表达式计算器中的内部错误”错误。 我在发布到生产时将其更改为 Release 并忘记将其更改回 Debug。

发布模式

调试模式

检查您对[DebuggerBrowsable]属性的使用; 我在 VisualStudio 2017 15.5 中找到了一个最小案例并将其发布在此处

在这种特殊情况下,表达式求值器 (EE) 崩溃似乎与应用于覆盖同名字段的属性的[DebuggerBrowsable]属性有关。 这将占人们在那里遇到的案例的一定比例,但在它得到修复之前,无法知道有多少是由于这个特定问题造成的。

完整和完整的演示示例如图所示(并包含在下面以备不时之需)

在此处输入图像描述

图像中代码的机器可读副本:

using System;
using System.Diagnostics;

class Program { static void Main() => new _derived(); }

abstract class _base
{
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public Object trace;
};

class _derived : _base
{
    public _derived() => Debugger.Break();      // <-- vs2017 EE crash when stopped here

    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    new public Object trace => base.trace;
}

在我的例子中,我在 2 个不同的文件夹中有 2 个相同的 dll 文件(似乎,一个 dll 不正确)。 删除.dll 并重建解决方案解决了我的问题。

在我的例子中,我试图检查的数据非常大,一个字符串意外地包含数百兆字节的数据。 当检查的数据量合理时,问题并不明显。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM