【问题标题】:CSC.exe throws "Process is terminated due to StackOverflowException" when compilingCSC.exe 在编译时抛出“由于 StackOverflowException 而终止进程”
【发布时间】:2016-06-29 17:10:42
【问题描述】:

我正在使用 Entity Framework 4.0

在创建具有超过 1k 属性的新类时,我在创建迁移包后遇到问题。尝试编译项目时,我得到 Build Failed。 “csc.exe 已退出,代码为 255”

在查看更多细节时,我在构建日志中看到了这个消息:

使用程序集“C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Build.Tasks.CodeAnalysis.dll”中的“Csc”任务。 1>任务“Csc” 1> C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:... 1>
1> 进程因 StackOverflowException 而终止。 1>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.CSharp.Core.targets(67,5): error MSB6006: "csc.exe" exited with code 255.

显然,迁移脚本中的 Up() 方法创建了一个非常大的 CreateTable 方法。我认为这是问题所在。不过我不太确定。

在使用EF的时候,真的不可能有这么多字段的类吗?

更新: 模型类在一个单独的项目中并且编译得很好。 问题出在迁移方法上。

它也是自动生成的,看起来像这样:

public partial class CustomClass : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.GeneratedClasses",
            c => new
                {
                    RowId = c.Int(nullable: false, identity: true),
                    RecordTime = c.DateTime(nullable: false),
                    Prop1 = c.Decimal(nullable: false, precision: 18, scale: 2),
                    Prop2 = c.Decimal(nullable: false, precision: 18, scale: 2),
                    Prop3 = c.Decimal(nullable: false, precision: 18, scale: 2),

...

                    PropN= c.Decimal(nullable: false, precision: 18, scale: 2),
                })
            .PrimaryKey(t => t.RowId);

    }

【问题讨论】:

  • 一个类中有 1k 个属性?!? o_O
  • 确实如此。不是我每天都在做的事。
  • 如果数据更多,那么你最终会出现内存不足异常...堆栈溢出异常意味着存在循环调用或递归调用,最终导致堆栈溢出异常
  • 我在上面的问题中添加了代码。 “...” = 1k 更多相同。

标签: c# msbuild


【解决方案1】:

一个类中超过 1000 个属性对我来说似乎太多了,真的!

暂且不说,问题很可能并非如此。 StackOverflowException 表示无限递归。可能存在引用自身的 EF 字段/属性,从而创建无限循环。

我建议禁用一些字段,然后尝试它是否可以编译,然后继续这样做,直到找到有问题的行。

【讨论】:

  • 好建议。这些属性是自动生成的,并且是纯获取;放;特性。没有递归。
  • 一个属性也可能导致这样的问题。
  • 我用生成的迁移脚本生成的代码文件示例更新了问题
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2013-01-13
  • 2020-11-02
相关资源
最近更新 更多