Недавно наткнулся на очень забавный и неочевидный баг студии. Суть бага – студия начинает подвисать при сохранении aspx/ascx файлов секунд так на 20-30. Через полминуты все проходит, и можно работать дальше. Воспроизводится стабильно, простым нажатием Ctrl+S. При этом студия не подвисает намертво, просто не отзывается на действия, и вот значок сохранения не пропадает из статус бара:

CropperCapture[2]

Запускаем второй экземпляр студии. Снимаем в DebugOptions and Settings чекбокс Enable Just My Code. Цепляемся им к первому экземпляру студии:

Options

attach

Нажимаем Ctrl+S в проблемном экземпляре студии. Видим в Output кучу исключений:

NotFound

Включаем в DebugExceptions остановку при бросании System.IO.FileNotFoundException. Сохраняем еще раз, смотрим на детали исключения:

breakRegion

В проекте нет явных ссылок на antlr.runtime. Но есть ссылка на DDay.iCal, которая хоть и ссылается на antlr, но не требует ее для нормальной работы. Распространяется DDay, естественно, без проблемной сборки.

При сохранении aspx-файла студия пытается пересоздать файл aspx.designer.cs. Для этого ей нужно получить типы всех элементов управления, упоминаемых в разметке. Например, студия видит в разметке элемент вроде:

Region2

Для получения конкретного типа PostBackTriggerControl студия берет список нейспейсов с префиксом lsf из конфигурации, и пытается найти каждую комбинацию “namespace.type”. А неймпейсов с префиксом lsf у нас оказалось много:

config

Студия достаточно быстро находит нужный ей LogicSoftware.EasyProjects.Web.Gui.Code.PostBackTriggerControl в сборке LogicSoftware.EasyProjects.Web.Gui.Code. Но на этом она не останавливается.

На всякий случай студия предпринимает попытки найти тип PostBackTriggerControl еще и во всех явно или косвенно упоминаемых сборках. Даже если сборка явно задана при регистрации неймспейса. Если тип найден, он запоминается в кэше. Поймав при поиске FileNotFoundException, студия забывает сохранить правильный результат в кэш.

Бешенное количество попыток – количество элементов на странице * количество регистраций неймспейсов * количество сборок на которые ссылается сайт * количество проблемных сборок -  и дает те самые 210 исключений при одном нажатии Ctrl+S. Исправляется подбрасываеним недостающих сборок в папку с зависимостями. Добавлять ссылки из web-проекта на них или копировать bin – необязательно. Достаточно, чтобы студия увидела их при поиске.