C#编译错误:“没有剩余的逻辑空间来创建更多的用户字符串”

时间:2009-09-01 13:55:46

标签: c# .net

我正在尝试编译一个一次性的“脚本”,一个自动生成的C#程序。该程序包含120,000个不同的字符串文字。 C#编译器无法构建它,说:

Unexpected error writing metadata to file '<removed>' -- 'No logical space left to create more user strings.'

.NET中是否存在对模块中字符串文字数量的硬性限制?这个限制是什么?有什么方法吗?

3 个答案:

答案 0 :(得分:12)

程序集中字符串的数量有限制,正如类,字段等的数量有限制一样。每个字符串都用32位metadata token标识,其中上层最左边的字节是元类型代码,低位是单独的数据记录。对于字符串,它们实际上标识了字符串堆中的偏移量,因此字符串最多可以有2 ** 24个字节,即16MiB。不确定字符串是以UTF-8还是UTF-16存储。

答案 1 :(得分:7)

我不知道.NET中的限制是什么,但是,如果它是资源限制,我会解决它,就像我们解决在旧的64K段时间里用尽的空间一样。

将字符串外部化 - 将它们放在外部文件中并简单地存储偏移量(如果它们不是空终止则为长度)。当您需要一个字符串时,从文件中加载它并使用它。

答案 2 :(得分:2)

我之前从未遇到过这种情况,但MSDN

上有一些信息和建议的解决方案

但是,除非您有充分的理由使用硬编码字符串文字,否则您应该考虑使用资源文件而不是大多数字符串的文字。