3

以下のコードは、私の悲しみの (3 つの) 例の 1 つです。これは、プログラムをクラッシュさせる単純な OpenFileDialog() 呼び出しです。XP では、ダイアログが数秒間開いたままになると、クラッシュが発生します。Vista では、ユーザーが [マイ コンピュータ] を選択するとクラッシュが発生します。VS2008 では、デバッガーが stackoverflowexception をキャッチすることがあります。最初の行 (new ...) にブレークポイントを入れると、vshost.exe がクラッシュします。ShowDialog() 行にブレーク ポイントを配置すると、FatalExecutionEngineError が発生します。vshost なしでコンパイルすると、アプリケーションはランダムにクラッシュするまで実行されます (XP のように、ある程度の時間があります)。

異なる種類のファイルを開く 2 つの開いているダイアログがあり、その 3 つすべてが同じ動作をします。同様のコードは、私の他のプロジェクトでは同じ動作を示しません。

スレッドアパートメントはシングルです。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();
    }
4

2 に答える 2

5

このダイアログを表示するメソッドは、どのような状況で呼び出されますか? このエラーの最も可能性の高い原因は、イベントが何度も生成され、多くのインスタンスがOpenFileDialogユーザーに表示されることです。それらは潜在的に互いの上に表示され、単一のダイアログのように見えます。

編集

失敗しているのがデバッガー シナリオだけの場合は、暗黙的な関数評価をデバッガー プロパティ ウィンドウ ([ツール] -> [オプション] -> [デバッガー]) でオフにしてみてください。フォームのプロパティの 1 つが、デバッガーで表示したときにスタック オーバーフローを引き起こしている可能性があります。

于 2010-01-18T18:45:20.633 に答える
1

プロジェクトに追加したDLLがヒープの破損を引き起こしていました。症状は奇妙で美しいクラッシュでした。

于 2010-01-18T23:32:49.237 に答える