Как изменить размер стека по умолчанию для управляемого исполняемого файла.net
Мы обнаружили, что одна из наших автоматически сгенерированных сборок генерирует исключение StackOverflowException для new (). Этот класс имеет (не стесняйтесь, пожалуйста) 400+ простых свойств, которые инициализируются (большинство по умолчанию (строка) и т. Д.) В конструкторе.
Мы замечаем, что на 64 битах все хорошо, но на 32 битах это идет на ура!
Нам нужно проверить, разумно ли для нашего варианта использования создать больший стек по умолчанию, чтобы дать нам передышку, пока мы заново проектируем генератор кода.
Мы бы особенно. заинтересован в решениях, которые включают app.config, если это возможно. Но я реалист, так что все будет хорошо.
Re причины стека над потоком. Мы сузили ошибку до рассматриваемого конструктора. Мои первые впечатления были также типа бесконечной рекурсии. Однако мы воспроизвели ошибку с помощью трехстрочного консольного приложения, которое:
creates an empty instance of class. calls a non static method (Clone) on the class who first job is to create and empty instance ready pass the properties into.Это идет ударом, поскольку это поражает второго конструктора.
Теперь, отлаживая исходный код .net, мы видим, что переполнение стека находится в Guid.NewGuid (), который передается в качестве второго параметра конструктору. Фактическая строка кода - это вызов родного вызова CoCreateGuid ().
So while it could be a bug in CoCreateGuid(), we want to eliminate our code from the problem. My first thought is to increase the size of the stack massively and see if this error reoccurs. Then, since I think we can control all use cases, is replace the constructor with object initialisation - think this can relieve the pressure on the stack.
Nb. We can stop the error from happening by removing just on int property from the class.