Stackoverflow / CLR Ошибка в C # OpenFileDialog - PullRequest
3 голосов
/ 18 января 2010

Код ниже - один (из трех) примеров моего горя. Это простой вызов OpenFileDialog (), который вызывает сбой программы. В XP сбой происходит, если диалоговое окно остается открытым в течение нескольких секунд. В Vista сбой происходит, если пользователь выбирает «Мой компьютер». В VS2008 отладчик иногда ловит исключение переполнения стека. Если я поставлю точку останова в первой строке (новая ...), vshost.exe вылетает. Если я поставлю точку останова в строке ShowDialog (), я получу FatalExecutionEngineError. Если я скомпилирую без vshost, приложение будет работать до случайного сбоя (как в XP - есть некоторое время).

Есть два других открытых диалога, которые открывают файлы разных типов, все три из которых имеют одинаковое поведение. Подобный код не показывает такое же поведение в других моих проектах.

Поток квартиры не замужем. Я попытался установить ValidateNames = false. Отладчик в большинстве случаев падает из глубины.

OpenFileDialog imageDlg = new OpenFileDialog();
imageDlg.Filter = "All Images|*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp|All Files|*.*|JPEGs (*.jpg)|*.jpg|PNGs (*.png)|*.png|TIFFs (*.tiff)|*.tiff|TIFFs (*.tif)|*.tif|BMPS (*.bmp)|*.bmp";
imageDlg.Title = "Select Scan Image";

if (DialogResult.OK == imageDlg.ShowDialog())
{
    updateImageDisplay();
}

Код обработчика события:

// 
// setScratchImageButton
// 
this.setScratchImageButton.Location = new System.Drawing.Point(191, 15);
this.setScratchImageButton.Name = "setScratchImageButton";
this.setScratchImageButton.Size = new System.Drawing.Size(26, 23);
this.setScratchImageButton.TabIndex = 8;
this.setScratchImageButton.Text = "...";
this.setScratchImageButton.UseVisualStyleBackColor = true;
this.setScratchImageButton.Click += new System.EventHandler(this.setScratchImageButton_Click);

Код называется

    private void updateImageDisplay()
    {
        if (null != project.srcImage)
        {
            imageDisplay.SizeMode = PictureBoxSizeMode.Normal;
            if (project.srcImage != null)
            {
                imageDisplay.ClientSize = new Size(project.srcImage.Width, project.srcImage.Height);
                imageDisplay.Image = (Image)project.srcImage;
            }
            this.ScratchImage.Text = project.srcImageLocation;
        }
        else
        {
            imageDisplay.Image = null;
            this.ScratchImage.Text = "";
        }
        ImageDisplayPanel.Refresh();
    }

Ответы [ 2 ]

5 голосов
/ 18 января 2010

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

EDIT

Если сбой происходит только в сценарии отладчика, попробуйте отключить неявную оценку функции в окнах свойств отладчика (Инструменты -> Параметры -> Отладчик). Возможно, одно из свойств вашей формы вызывает переполнение стека при просмотре через отладчик.

1 голос
/ 19 января 2010

DLL, которую я добавил в проект, вызывал повреждение кучи. Симптом был странный и красивый, вылетает.

...