VS2017/2019中构建时出现了StackOverflowException

4

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

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

我已尝试在true和false之间切换UseSharedCompilation标志,但似乎没有效果。这个问题似乎与链接的Fluent Migrator方法的数量有关(下面会有更多信息),但我没有办法更改代码来缓解这个问题。

我对编译器不太熟悉,所以不知道VS2015和新版本之间发生了什么变化,以致于这个问题突然出现。能否帮我理解,并且更好的是,给我一些傻瓜式的建议,使我的构建可以在VS2017/2019中工作?

细节:我继承了一些紧密耦合于与许多类似应用程序共享的通用dB模式的软件。 使用一种消耗包含数据和元数据的一堆XML文件的工具向db模式中插入新表和参考数据。 对于我继承的应用程序,没有测试覆盖,并且必须通过搜索和替换以及手动检查更新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)

1
我可能会把这个问题提交给团队:https://github.com/dotnet/roslyn/issues 如果可能的话,您可以尝试共享一个可重现的示例,或者尝试获取编译器崩溃时的转储。这可能与此问题有关:https://github.com/dotnet/roslyn/issues/9795 - JoshVarty
1
另一个可能有解决方法的问题:https://stackoverflow.com/questions/41871032/build-project-in-vs2015-csc-exe-exited-with-code-1073741571 - JoshVarty
@JoshVarty 你真是个超级牛人!那个链接解决了我的问题。你应该把它发布为答案,这样我就可以给你点赞了。 - ket
1个回答

2
我相信当链接许多流畅调用时,这是已知的Roslyn错误:https://github.com/dotnet/roslyn/issues/9795 根据另一个答案,解决方法似乎是将您的流畅调用拆分为多个语句:
例如:
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的帮助。 - ket
当在 StringBuilder 中链接多个 Append() 调用时,这对我也有帮助。只需将对象分配给一个变量并在没有流畅接口的情况下调用它即可。如果您有许多链接调用但它们没有达到编译器限制,这也可以加快编译时间。 - Christiano Kiss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接