Ошибка компиляции C #: «Не осталось логического пространства для создания пользовательских строк» - PullRequest
8 голосов
/ 01 сентября 2009

Я пытаюсь скомпилировать одноразовый «скрипт», автоматически сгенерированную программу на C #. Эта программа содержит 120000 различных строковых литералов. Компилятор C # не может построить это, говоря:

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

Есть ли в .NET жесткое ограничение на количество строковых литералов, которые можно иметь в модуле? Что это за предел? Есть ли способ обойти это?

Ответы [ 3 ]

12 голосов
/ 01 сентября 2009

Существует ограничение на количество строк в сборке, так же как существуют ограничения на количество классов, полей и т. Д. Каждый из них идентифицируется с помощью 32-битного токена метаданных , где самый старший байт является кодом мета-типа, а младшие биты являются отдельной записью данных. Для строк они фактически идентифицируют смещение в куче строк, так что вы можете иметь максимум 2 ** 24 байта для строк, то есть 16MiB. Не уверен, хранятся ли строки в UTF-8 или UTF-16.

7 голосов
/ 01 сентября 2009

Я понятия не имею, что такое ограничения в .NET, но, если это ограничение ресурсов, я бы решил это так же, как мы решали нехватку места в старые добрые времена 64-сегментного сегмента.

Внешние строки - поместите их во внешний файл и просто сохраните смещения (и длины, если они не завершены нулем). Когда вам нужна строка, загрузите ее из файла и используйте.

2 голосов
/ 01 сентября 2009

Я никогда не сталкивался с этим раньше, но есть некоторая информация и предлагаемые решения по MSDN

Однако, если у вас нет веских причин для использования жестко закодированных строковых литералов, вам, вероятно, следует рассмотреть возможность использования файлов ресурсов, а не литералов для большинства строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...