Ошибка сборки: "Выражение слишком длинное или сложное для компиляции"

Время от времени, когда я строю конкретное решение, я получаю случайное количество "Выражение слишком длинное или сложное для компиляции" в окне Список ошибок. Однако единственный элемент, на который указывает ошибка - это конкретный проект, а не файл в проекте или конкретный LOC.

Когда я сталкиваюсь с этим, я очищаюсь, а затем перезагружаю VS, и это, кажется, исправляет это. Любые идеи о том, что вызывает это?

Это конкретное решение включает в себя 50 проектов.

11 ответов

Решение

К вашему сведению, эта ошибка характерна для компилятора, исчерпавшего пространство стека. Обычно это происходит, когда вы бросаете проблему "глубокой рекурсии" в компилятор, например,

int x = (1 + (1 + (1 + (1 + ......... + 1 ) + 1 ) + 1 ) + 1);

скажем, несколько тысяч глубиной. Синтаксические и семантические анализаторы являются анализаторами рекурсивного спуска и поэтому склонны к исчерпанию стекового пространства в экстремальных сценариях.

Я понятия не имею, почему выключение и запуск могут повлиять на это, хотя. Это действительно странно.

Если у вас будет надежное репро, я бы с удовольствием посмотрел его. Либо опубликуйте его здесь, либо введите ошибку в Connect, и мы посмотрим на это. Без твердого репродукции очень трудно сказать, что здесь происходит.

Я получил эту ошибку в одном проекте, когда я переключился с Visual Studio 2012 на Visual Studio Community 2013. В моем случае это был гигантский файл (25k строк, не написанный мной) с List<string[]> инициализируется инициализатором коллекции.

Что-то вроде этого:

public class Class
{

    public List<string[]> BigList
    {
        get
        {
            return new List<string[]>()
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

Я изменил это на string[][] и проект начал компилироваться

public class Class
{

    public string[][] BigList
    {
        get
        {
            return new string[][]
            {
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                .
                .
                .
                .
                .
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"},
                new string[]{"foo","bar"}
            }
        }
    }
}

У меня была такая же проблема на 64-битной машине (VS 2012).

Я использовал ответ @MikeFlynn, чтобы найти папку, вызвавшую ошибку.

Наконец, я обнаружил, что у меня есть страница Help.aspx без кода позади - только HTML, но в нем есть несколько изображений значков, встроенных как base 64

<img src="data:image/png;base64 ... />

Я преобразовал его в статический HTML, и он скомпилирован.

PS Тот же проект компилировался нормально на 32-битной машине VS2012. Обе машины работали под управлением Windows 7.

У меня возникла эта проблема сегодня в Visual Studio 2019. У меня очень длинная строка

<img height="445" src="data:image/png;base64,iVBORw...

в моем файле file.aspx. Даже длинные изображения в vs2019 могут вызвать эту проблему.

При сборке вы можете видеть, что при сборке выводится последняя папка, которую она проверяет, прежде чем она не работает. Я удалил файлы в этой папке и вернул их один за другим. Наконец-то нашел проблему. Я не знаю точно, что это такое, но это была страница ASPX с большим количеством HTML. Он не использовался часто, поэтому я просто удалил его из проекта и теперь он компилируется.

Если очистка и восстановление работают, это, очевидно, не проблема с вашим кодом. Вы должны сообщить об этом в Microsoft, похоже на ошибку VS.

Я получил эту проблему сегодня. Каким-то образом я получил действительно длинную строку в моем index.cshtml файл. Поэтому проверьте наличие длинных строк, которые могут вызвать эту проблему.

Я никогда не видел этого в дикой природе.

Тем не менее, поиск в Google может быть вызван избытком ссылок на сборки, одной конкретной цитатой:

Если я уменьшу количество ссылочных сборок до 5500, он будет скомпилирован и работает

Теперь, конечно, вы бы заметили, что список зависимостей настолько велик, не могли бы вы проверить, есть ли у вас слишком большое количество ссылок на ссылки?

При запуске из IDE приложение работало нормально, на хостинге в IIS возникла указанная выше ошибка, после того, как я попробовал много шагов на основе изображений и base64 и т. Д. После настройки в публикации web.config у меня сработал, более ранняя отладка = "истина" была установлена, сделана ложной, и это сработало.

      <compilation debug="false" defaultLanguage="c#" maxBatchGeneratedFileSize="1000" maxBatchSize="1000" targetFramework="4.5">

Я получил эту причину ошибки очень большого файла SVG. и после Google и некоторого личного эксперимента я обнаружил, что решение для большого файла SVG:

@Html.Raw(File.ReadAllText(Server.MapPath("~/image.svg")))

В бритвенном файле есть другой подход с частичным html, но, к сожалению, этот трюк не работает с большим SVG-файлом.

надеюсь, это поможет..

Могу поделиться своим опытом с этой ошибкой. Типичный шедевр Microsoft (или просто кусок...) Наша проблема на самом деле была из-за слишком большого количества DLL для компиляции IIS. Диагностировать это было больно (так как диагностики нет). Удаление некоторых ненужных библиотек DLL (например, библиотек DLL модульных тестов) из основной папки BIN решило проблему. Иди разбери...

Другие вопросы по тегам