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