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

Pai*_*rdo 5 c# string visual-studio-2015

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

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

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

ank*_*sen 8

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

如果您在网上搜索 CS8103 错误,则没有太多信息。而且大多数信息并不完全准确。

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

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

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

因此,请尝试将其理解为在 cs 文件中定义的所有字符串 - 连接为一个。如果这个字符串变得太大 - 我们会冒运行时错误的风险,正如上面 Roslyn 问题所解释的那样。

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

public void Main() {
    Console.WriteLine("test");
    string test = "AnotherTest" + " " + "run";
}
Run Code Online (Sandbox Code Playgroud)

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

我们的程序集昨天在将功能分支合并到 master 时达到了限制。那是使杯子滚过的著名滴。

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

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

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

我知道,太多的文字 - 但我认为这值得一个彻底的解释,因为很难找出导致问题的原因。

考虑到其他地方的稀疏信息,这不是一个常见问题。但是它会停止生产线,并且在解决方案确定之前没有人可以编译。


Ard*_*dar 3

I guess its a new compiler in VS2015, which restricts too much use of string literals.

See EmitErrorTests line 329: http://source.roslyn.codeplex.com/#Roslyn.Compilers.CSharp.Emit.UnitTests/Emit/EmitErrorTests.cs

The solution is to not overflow your heap. Try to get the total memory your program (if its already using too much) by

long totalHeapMemoryUsed  = GC.GetTotalMemory(false);
Run Code Online (Sandbox Code Playgroud)

Try to not use static strings, but limit it to local scopes (function or class scope), or use Resources.