StackOverflowException при сборке в VS2017 / 2019 - PullRequest
3 голосов
/ 17 октября 2019

У меня есть тестовый проект, который успешно создан в VS2015, но сборка завершается неудачно из-за исключения StackOverflowException, когда я пытаюсь построить его в VS2017 / 2019. Последнее утверждение, напечатанное в журнале диагностики в точке, предшествующей возникновению исключения, таково:

Using shared compilation with compiler from directory: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Roslyn

Я пытался переключить флаг UseSharedCompilation между истиной и ложью, нокажется, не имеет никакого эффекта. Эта проблема, по-видимому, связана с количеством сцепленных методов Fluent Migrator (подробнее об этом ниже), но у меня нет способа изменить код, чтобы смягчить эту проблему.

Я не очень хорошо себя чувствуюразбираюсь в компиляторах, так что я в недоумении относительно того, что изменилось между VS2015 и более новыми версиями, так что эта проблема внезапно возникнет. Может ли кто-нибудь помочь мне понять, а еще лучше, дать мне несколько советов по сборке для чайников, чтобы заставить мою сборку работать под VS2017 / 2019?

Подробности: Я унаследовал некоторое программное обеспечение, котороетесно связана с общей схемой дБ, используемой совместно с несколькими подобными приложениями. Новые таблицы и справочные данные вставляются в схему базы данных с помощью инструмента, который использует кучу файлов XML, которые содержат как данные, так и метаданные. Для приложения, которое я унаследовал, не было тестового покрытия и около 40 тыс. Строк XML-контента, которые нужно было обновить с помощью поиска и замены и ручной проверки. Чтобы решить эти и связанные с ними проблемы, я написал некоторый код для анализа файлов XML и автоматической генерации классов C # с содержимым Fluent Migrator. Некоторые из (ненормализованных) таблиц имеют сотни столбцов, и это, кажется, является специфической проблемой, вызывающей исключение StackOverflowException. Компилятор, похоже, способен обрабатывать около 200 .WithColumn вызовов, но помимо этого он взрывается. Кратко кроме ниже. Я упоминаю об этом просто для того, чтобы представить контекст проблемы и объяснить, почему, черт возьми, я делаю то, что делаю.

.WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)
         //.WithColumn(nameof(ColumnDescriptions.YYY)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.YYY)

1 Ответ

1 голос
/ 19 октября 2019

Я полагаю, что это известная ошибка Roslyn при объединении нескольких беглых вызовов: https://github.com/dotnet/roslyn/issues/9795

С другой ответ Обходным решением является разделение ваших беглых вызовов на несколько операторов:

Например:

var result = x.WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100).NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)

Может быть разбит на

var temp = .WithColumn(nameof(ColumnDescriptions.XXX)).AsString(100)
var result = temp.NotPublishedOffline().WithColumnDescription(ColumnDescriptions.XXX)
...