Мы обнаружили, что одна из наших автоматически генерируемых сборок создает исключение StackOverflowException для new (). Этот класс имеет (не стесняйтесь, пожалуйста) 400+ простых свойств, которые инициализируются (большинство по умолчанию (строка) и т. Д.) В конструкторе.
Мы замечаем, что на 64-битной системе все в порядке, а на 32-х битах идет на ура!
Нам нужно проверить, целесообразно ли для нашего варианта использования создать больший стек по умолчанию, чтобы дать нам передышку, пока мы перестраиваем генератор кода.
Мы бы особенно. заинтересован в решениях, которые включают app.config, если это возможно. Но я реалист, поэтому все будет хорошо.
Re причины переполнения стека. Мы сузили ошибку до рассматриваемого конструктора. Мои первые впечатления были также типа бесконечной рекурсии. Однако мы воспроизвели ошибку, используя консольное приложение с 3 линиями, которое:
- создает пустой экземпляр класса.
- вызывает нестатический метод (Clone) для класса, первым заданием которого является создание, и пустой экземпляр готов передать свойства.
Поражается во втором конструкторе.
Теперь отлаживая исходный код .net, мы видим, что переполнение стека происходит в Guid.NewGuid (), который передается в качестве второго параметра конструктору. Фактическая строка кода - это вызов родного вызова CoCreateGuid ().
Поэтому, хотя это может быть ошибка в CoCreateGuid (), мы хотим устранить наш код из этой проблемы. Моя первая мысль - массово увеличить размер стека и посмотреть, повторяется ли эта ошибка. Тогда, поскольку я думаю, что мы можем контролировать все варианты использования, это заменить конструктор инициализацией объекта - думаю, это может уменьшить нагрузку на стек.
Nb. Мы можем предотвратить возникновение ошибки, просто удалив свойство int из класса.