Когда я пытаюсь скомпилировать сборку в VS 2008, я получаю (иногда, обычно после 2-3 часов работы с проектом) следующую ошибку
Metadata file '[name].dll' could not be opened --
'Not enough storage is available to process this command.
Обычно, чтобы избавиться от этого, мне нужно перезапустить Visual Studio
Сборка, которую мне нужно использовать в моем проекте, достаточно БОЛЬШАЯ (> 70 Мб), и, вероятно, это является причиной этой ошибки, я никогда не видел ничего подобного в моих предыдущих проектах. Хорошо, если это причина, по которой мой вопрос, почему это происходит и что мне нужно сделать, чтобы остановить это.
На моих дисках достаточно свободной памяти и 2 ГБ ОЗУ (при возникновении исключения используется только ~ 1,2 ГБ)
Я гуглил ответы на подобные вопросы.
Предложения, обычно относящиеся к:
- к числу пользовательских обработчиков, ограниченных в WinXP ...
- до физического лимита памяти, доступной для процесса
Я не думаю, что кто-либо мог бы объяснить мой случай
Для пользовательских обработчиков и других ресурсов графического интерфейса - я не думаю, что это может быть проблемой. Большая 70-мегабайтная сборка на самом деле является кодом без GUI, который работает с сокетами и реализует парсеры проприетарных протоколов. В моем текущем проекте у меня есть только 3 формы GUI, с общим количеством элементов управления GUI <100. </p>
Полагаю, мой случай ближе к тому факту, что в Windows XP адресное пространство процесса ограничено 2 ГБ памяти (и, учитывая сегментацию памяти, возможно, у меня недостаточно свободного сегмента, чтобы выделить память).
Однако трудно поверить, что сегментация может быть такой большой после всего лишь 2-3 часов работы с проектом в Visual Studio. Диспетчер задач показывает, что VS потребляет около 400-500 Мб (OM + VM). Во время компиляции VS нужно загружать только метаданные.
Хорошо, в этой библиотеке много классов и интерфейсов, но все же я ожидаю, что 1-2 Мбайт более чем достаточно для выделения метаданных , которые используются компилятором для поиска всех открытых классов. и интерфейсы (хотя это только мое предложение, я не знаю, что именно происходит внутри CLR
при загрузке метаданных сборки).
Кроме того, я бы сказал, что весь размер сборки настолько велик только потому, что это библиотека C++ CLI
, в которой другие библиотеки, управляемые um, статически связаны в один DLL
. Я подсчитал (используя Reflector), что .NET (управляемый) код составляет примерно 5-10% этой сборки.
Есть идеи, как определить истинную причину этой ошибки? Существуют ли какие-либо ограничения или рекомендации относительно размера сборки .NET? ( Да, я знаю, что стоит подумать о рефакторинге и разбиении большой сборки на несколько более мелких частей, но это сторонний компонент, и я не могу перестроить его )