当我向返回长字符串的类添加静态字符串属性时,出现此错误。
在同一个项目中,我添加了很多超过 20k 个字符的字符串属性,但是当我创建另一个返回字符串的属性并构建项目时,我得到了这个错误。
我怎样才能增加这个限制?我尝试使用 Stringbuilder 但同样发生了。
只想把我最近的经历带到桌面上。
如果你在网上搜索CS8103错误,周围的信息不多。大多数信息并不完全准确。
我们昨天在一个大型 C# 解决方案中遇到了这个问题。
据我了解这个编译错误,问题是所有编译时定义的字符串连接的总长度。
我将其解释为编译器将所有字符串放入一个巨大的数据块中,然后当引用给定的字符串时,它会索引到这个(或类似的)中。
所以试着把它理解为你在 cs 文件中定义的所有字符串——连接成一个。如果此字符串变得太大 - 正如上面的 Roslyn 问题所解释的那样,我们将面临运行时错误的风险。
代码中的所有字符串,双引号内的都算在内。
public void Main() {
Console.WriteLine("test");
string test = "AnotherTest" + " " + "run";
}
上面的程序有 4 + 11 + 1+ 3 = 19 => "testAnotherTest run"
昨天我们的程序集在将一个特性分支合并到 master 时达到了极限。那就是著名的让杯子溢出的跌落。
似乎没有解决方法,只能将大型程序集拆分成更小的部分,或者将大块字符串移动到资源或其他外部文件中。
我们通过注释掉大部分遗留代码来验证这一点——我们可以再次编译。
我们的解决方案是从大型组件中重构特定区域,并为此创建一个新组件。
我知道,文字太多了——但我认为这应该得到彻底的解释,因为很难找出导致问题的原因。
鉴于其他地方的信息稀疏,这不是一个常见问题。但是它停止了生产线,并且在解决方案被修复之前没有人可以编译。
我猜它是 VS2015 中的新编译器,它限制了对字符串文字的过多使用。
参见 EmitErrorTests 第 329 行: http://source.roslyn.codeplex.com/#Roslyn.Compilers.CSharp.Emit.UnitTests/Emit/EmitErrorTests.cs
解决方案是不要溢出你的堆。尝试通过
获取程序的总内存(如果它已经使用太多)long totalHeapMemoryUsed = GC.GetTotalMemory(false);
尽量不要使用静态字符串,而是限制在局部作用域(函数或类作用域),或者使用Resources。
尝试将长字符串移动到资源中
就我而言,我有大量的迁移 SQL 脚本。这个问题在我将它们移动到资源中后得到解决
我们遇到这个问题是因为我们正在使用实体框架代码优先迁移。
我们使用这些迁移来运行 SQL 脚本来更新数据库。这些脚本有时会很大。
随着时间的推移,文件不断累积,最终我们得到了这个错误。从项目中隐藏旧的 sql 脚本基本上解决了这个问题。
我设法通过在 .csproj 文件中添加以下(*ed 行)来解决此问题:
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
*<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
*<PreserveCompilationContext>true</PreserveCompilationContext>
<UserSecretsId>165df0cf-51ff-4f1e-b880-d98a9de58bc2</UserSecretsId>
</PropertyGroup>
顺便说一句,我的项目是一个支持 MVC - Razor 的 .net 核心应用程序
请升级你的项目.net 7.