【问题标题】:StackOverflowException on build in VS2017/2019在 VS2017/2019 中构建 StackOverflowException
【发布时间】:2019-10-17 16:27:17
【问题描述】:

我有一个在 VS2015 中成功构建的测试项目,但是当我尝试在 VS2017/2019 中构建它时,由于 StackOverflowException 导致构建失败。在异常发生之前,诊断日志中打印的最后一条语句是这样的:

Using shared compilation with compiler from directory: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Roslyn

我尝试在真假之间切换UseSharedCompilation 标志,但似乎没有效果。这个问题似乎与链式 Fluent Migrator 方法的数量有关(下面会详细介绍),但我没有办法更改代码来缓解这个问题。

我不精通编译器,所以我不知道 VS2015 和更新版本之间发生了什么变化,以至于这个问题会突然出现。有人可以帮助我理解,甚至更好地给我一些构建傻瓜的建议,让我的构建在 VS2017/2019 下工作吗?

详细信息: 我继承了一些与通用 dB 架构紧密耦合的软件,该架构与一堆类似的应用程序共享。使用一种工具将新表和引用数据插入到 db 模式中,该工具使用一组包含数据和元数据的 XML 文件。对于我继承的应用程序,没有测试覆盖率,大约 40k 行 XML 内容必须通过搜索和替换和手动检查进行更新。为了解决这些和相关问题,我编写了一些代码来解析 XML 文件并使用 Fluent Migrator 内容自动生成 C# 类。一些(非规范化)表有数百列,这似乎是导致 StackOverflowException 的特定问题。编译器似乎能够处理大约 200 个 .WithColumn 调用,但除此之外,它会被炸毁。简要,除了以下。我提到这一点只是为了提供有关问题的背景并解释我到底为什么要做我正在做的事情。

.WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)
         //.WithColumn(nameof(ColumnDescriptions.YYY)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.YYY)

【问题讨论】:

标签: c# visual-studio visual-studio-2017 roslyn csc


【解决方案1】:

我相信这是一个已知的 Roslyn 错误,将许多流畅的调用链接在一起:https://github.com/dotnet/roslyn/issues/9795

来自another answer 的解决方法似乎是将您的流利调用拆分为多个语句:

例如:

var result = x.WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)

可以分解成

var temp = .WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100)
var result = temp.NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)

【讨论】:

  • 正确!感谢@JoshVarty 的帮助。
  • StringBuilder 中链接多个Append() 调用时,这也为我解决了问题。通过将对象分配给一个变量并在没有流畅接口的情况下调用它,它就可以工作了。如果您有大量链接调用但它们没有达到编译器限制,它还可以加快编译时间。
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多