【问题标题】:Build error: "An expression is too long or complex to compile"构建错误:“表达式太长或太复杂而无法编译”
【发布时间】:2011-11-16 20:02:53
【问题描述】:

当我构建一个特定的解决方案时,我会在错误列表窗口中得到随机数量的“一个表达式太长或太复杂而无法编译”。但是,错误指向的唯一项目是特定项目,而不是项目中的文件或特定 LOC。

当我遇到这种情况时,我会“清理”然后重新启动 VS,这似乎可以解决问题。关于造成这种情况的任何想法?

这个特殊的解决方案有 50 个项目。

【问题讨论】:

  • 您是否启用了任何可能会干扰编译的插件/扩展?
  • 我目前已安装、启用和更新了“Go To Definition”和“Productivity Power Tools”。
  • 我无法忍受处理超过 6 个项目/解决方案......我为你感到很多痛苦。
  • 我都启用了 88-project 解决方案,其中一些包含超过 5000 行长的 switch 语句(不要问),并且没有得到它,所以它必须是什么否则。
  • @drharris,哇。你有我的同情。

标签: c# visual-studio-2010 .net-4.0


【解决方案1】:

仅供参考,该错误是编译器耗尽堆栈空间的特征。通常,当您在编译器中抛出“深度递归”问题时会发生这种情况,例如,

int x = (1 + (1 + (1 + (1 + ......... + 1 ) + 1 ) + 1 ) + 1);

说,几千深。句法和语义分析器都是递归下降分析器,因此在极端情况下容易耗尽堆栈空间。

不过,我不知道为什么关闭并重新开始会影响这一点。真是奇怪。

如果你得到一个可靠的复制品,我很乐意看到它。要么在这里发布它,要么在 Connect 上输入一个错误,我们会看看它。没有可靠的重现,虽然很难说这里发生了什么。

【讨论】:

  • 为什么堆栈溢出错误至少不能指向正确的区域? (我敢肯定这是有充分理由的)
  • @configurator:您想使用哪个调用堆栈来调用错误分析程序?我们在编写脚本时一直遇到这个问题;我们会用完堆栈并调用浏览器告诉它显示“堆栈外”错误,然后当然会再次用尽堆栈。我向你保证,Windows 不会善待线程两次 用完堆栈的程序。在 C# 编译器中,当我们用完堆栈时,我们只是恐慌并一直展开到顶级处理程序;当我们放松时,“我们在哪里”就消失了。
  • @Eric 我假设每个堆栈都有一个 heaf 引用的对象来保存当前文件(和行,但可能有点太贵)正在处理并在进行时更新它就足够了,这样错误就足够了消息可能更具体一点。或者您是否在执行此操作时递归到表示可能不同文件的多个不同“对象”。
  • @Eric 显然实现该功能是有成本的,并且可能运行它。但我原以为它对您(如工具链的内部开发人员)有助于追踪狗食中固有的更令人不快的错误
  • @ShuggyCoUk:确实,我们可以做这样的事情。我们已经在调用堆栈中嵌入了提示,允许我们确定崩溃发生的时间,比如解析、语义分析和发射。我们可能会在 Roslyn 中构建某种更好的诊断系统,但是,那里没有任何承诺。它仍在不断变化中。
【解决方案2】:

当我从 Visual Studio 2012 切换到 Visual Studio Community 2013 时,我在一个项目中遇到了这个错误。 在我的情况下,它是一个巨大的文件(25k 行,不是我写的),其中 List<string[]> 由集合初始化程序初始化。

类似这样的:

public class Class
{

    public List<string[]> BigList
    {
        get
        {
            return new List<string[]>()
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

我改成string[][],项目开始编译

public class Class
{

    public string[][] BigList
    {
        get
        {
            return new string[][]
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

【讨论】:

  • 谢谢你,你救了我的命。
  • 这也解决了我的问题。我有一个 List ,其中包含超过 40,000 多个单词,并且收到该错误并将其更改为 string[] 解决了错误!!!
【解决方案3】:

在构建时,您可以看到构建输出是它在失败之前检查的最后一个文件夹。我删除了该文件夹中的文件,并将它们一个一个带回来。终于找到问题了。我不知道它到底是什么,但它是一个包含大量 HTML 的 .aspx 页面。它不经常使用,所以我只是将它从项目中删除,现在它可以编译了。

【讨论】:

    【解决方案4】:

    我在 64 位机器(VS 2012)中遇到了同样的问题。

    我使用@MikeFlynn 的答案来定位导致错误的文件夹。

    最后我发现我有一个 Help.aspx 页面,后面没有代码——只有 HTML 但它有多个图标图像嵌入为 base 64

    <img src="data:image/png;base64 ... />
    

    我将其转换为静态 HTML 并编译。

    附:同一个项目正在编译 O.K.在 32 位 VS2012 机器中。 两台机器都运行 Windows 7。

    【讨论】:

      【解决方案5】:

      我今天在 Visual Studio 2019 中遇到了这个问题。我得到了一个很长的字符串

      <img height="445" src="data:image/png;base64,iVBORw...
      

      在我的 file.aspx 文件中。即使是 vs2019 中的长图像也可能导致此问题。

      【讨论】:

        【解决方案6】:

        如果清理和重建工作正常,那么您的代码显然不是问题。您应该将此报告给 Microsoft,这似乎是一个 VS 错误。

        【讨论】:

          【解决方案7】:

          我今天遇到了这个问题。不知何故,我的index.cshtml 文件中有一个很长的字符串。因此,请检查可能导致此问题的长字符串。

          【讨论】:

            【解决方案8】:

            我从未在野外见过这种情况。

            但是,通过谷歌搜索它很可能来自过多的程序集引用,一个特定的引用:

            如果我将引用的程序集的数量减少到 5500 个,它将被编译并工作

            现在,您肯定会注意到一个如此庞大的依赖项列表,您能否检查一下您是否引用了过多的程序集?

            【讨论】:

            • 怎么会有人引用 5000 个程序集?
            • 刚刚检查过;它似乎不是太大。那个人指的是 5500 个单独的程序集吗?或者只是将每个项目中的程序集引用的数量相加并计算 System、System.XML 等重复项?
            • 我收到此错误,我相信出于同样的原因,我只引用了 63 个程序集。
            【解决方案9】:

            我得到这个错误的原因是非常大的 svg 文件。在谷歌和一些个人实验之后,我发现大 svg 文件的解决方案是:

            @Html.Raw(File.ReadAllText(Server.MapPath("~/image.svg")))
            

            在 razor 文件中,还有另一种使用 html 部分的方法,但不幸的是,这个技巧不适用于大 svg 文件。

            希望对您有所帮助..

            【讨论】:

              【解决方案10】:

              我可以分享我们对这个错误的经验。典型的微软杰作(或者只是一个......) 我们的问题实际上是由于 IIS 无法编译的 DLL 太多。诊断它是一种痛苦(因为不存在诊断)。从主 BIN 文件夹中删除一些不必要的 DLL(如单元测试 DLL)已经解决了这个问题。去图...

              【讨论】:

                【解决方案11】:

                从 IDE 运行时,应用程序运行良好,在托管到 IIS 时,在尝试了基于图像和 base64 等给出的许多步骤后,出现上述错误。在发布 web.config 上进行设置对我有用,较早的 debug = "true" 已设置,将其设为 false,并且可以正常工作。

                <compilation debug="false" defaultLanguage="c#" maxBatchGeneratedFileSize="1000" maxBatchSize="1000" targetFramework="4.5">
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-06-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多