C# 程序使用的用户字符串的组合长度超过了允许的限制。尝试减少字符串文字的使用

问题描述 投票:0回答:6

当我向返回长字符串的类添加静态字符串属性时,出现此错误。

在同一个项目中,我添加了很多超过 20k 个字符的字符串属性,但是当我创建另一个返回字符串的属性并构建项目时,我得到了这个错误。

我怎样才能增加这个限制?我尝试使用 Stringbuilder 但同样发生了。

c# string visual-studio-2015
6个回答
11
投票

只想把我最近的经历带到桌面上。

如果你在网上搜索CS8103错误,周围的信息不多。大多数信息并不完全准确。

我们昨天在一个大型 C# 解决方案中遇到了这个问题。

据我了解这个编译错误,问题是所有编译时定义的字符串连接的总长度。

我将其解释为编译器将所有字符串放入一个巨大的数据块中,然后当引用给定的字符串时,它会索引到这个(或类似的)中。

所以试着把它理解为你在 cs 文件中定义的所有字符串——连接成一个。如果此字符串变得太大 - 正如上面的 Roslyn 问题所解释的那样,我们将面临运行时错误的风险。

代码中的所有字符串,双引号内的都算在内。

public void Main() {
    Console.WriteLine("test");
    string test = "AnotherTest" + " " + "run";
}

上面的程序有 4 + 11 + 1+ 3 = 19 => "testAnotherTest run"

昨天我们的程序集在将一个特性分支合并到 master 时达到了极限。那就是著名的让杯子溢出的跌落。

似乎没有解决方法,只能将大型程序集拆分成更小的部分,或者将大块字符串移动到资源或其他外部文件中。

我们通过注释掉大部分遗留代码来验证这一点——我们可以再次编译。

我们的解决方案是从大型组件中重构特定区域,并为此创建一个新组件。

我知道,文字太多了——但我认为这应该得到彻底的解释,因为很难找出导致问题的原因。

鉴于其他地方的信息稀疏,这不是一个常见问题。但是它停止了生产线,并且在解决方案被修复之前没有人可以编译。


3
投票

我猜它是 VS2015 中的新编译器,它限制了对字符串文字的过多使用。

参见 EmitErrorTests 第 329 行: http://source.roslyn.codeplex.com/#Roslyn.Compilers.CSharp.Emit.UnitTests/Emit/EmitErrorTests.cs

解决方案是不要溢出你的堆。尝试通过

获取程序的总内存(如果它已经使用太多)
long totalHeapMemoryUsed  = GC.GetTotalMemory(false);

尽量不要使用静态字符串,而是限制在局部作用域(函数或类作用域),或者使用Resources。


2
投票

尝试将长字符串移动到资源中

就我而言,我有大量的迁移 SQL 脚本。这个问题在我将它们移动到资源中后得到解决


1
投票

我们遇到这个问题是因为我们正在使用实体框架代码优先迁移。

我们使用这些迁移来运行 SQL 脚本来更新数据库。这些脚本有时会很大。

随着时间的推移,文件不断累积,最终我们得到了这个错误。从项目中隐藏旧的 sql 脚本基本上解决了这个问题。


0
投票

我设法通过在 .csproj 文件中添加以下(*ed 行)来解决此问题:

 <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    *<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
    *<PreserveCompilationContext>true</PreserveCompilationContext>
    <UserSecretsId>165df0cf-51ff-4f1e-b880-d98a9de58bc2</UserSecretsId>
 </PropertyGroup>

顺便说一句,我的项目是一个支持 MVC - Razor 的 .net 核心应用程序


0
投票

请升级你的项目.net 7.

© www.soinside.com 2019 - 2024. All rights reserved.