Win7 64位在使用winforms和C#时,ResumeLayout()会导致程序无声崩溃

3
我正在使用C#构建一个Windows Forms应用程序,在Windows 7 64位上测试时发现了一个静默崩溃问题。
它失败的确切行是在InitializeComponent()函数的末尾附近的this.SuspendLayout(false);。这是来自Forms Designer的Visual Studio生成的代码的一部分。
没有异常,也没有弹出窗口显示程序已崩溃,什么都没有。一旦到达那一行,它就会停止运行。这只在64位中发生。删除该行后,程序可以运行,但无法最大化,并且有几个与窗口属性相关的奇怪问题。
我尝试过从更改构建设置到使用CorFlags.exe的所有方法,但都没有帮助。可能的问题是什么?
如果有区别的话,我正在使用OpenTK和GL控件。

2
可能只是这个已知问题,即在 x64 开发机器上的静默异常。这是最令人烦恼的 bug。也许你可以将 InitializeComponent(); 放在 try catch 块中,并找出真正的异常是什么。 - gideon
嗯,这确实很有趣。我在Application.Run()周围放置了一个try catch块,希望能捕获到一些异常,但是什么也没有发生,我会尝试在InitializeComponent()周围加一个块并查看是否有异常被捕获。感谢提供链接。 - roastbeef
4个回答

1
我遇到了与ResumeLayout()相同的问题。它在几台机器上运行良好,但有一个用户出现了“目标调用的异常已经被抛出”的情况。不是很有帮助。不幸的是,他们也隐藏了一些Exception.StackTrace的细节。我咨询了我们的专家,他觉得这是一个调整大小的问题。在调试-->异常中选择所有选项后,我发现了问题的确切位置。然后我在使用某个函数重新定位复选框时就能够打断点了。由于某种原因,这在这个用户的电脑上会引发一个超出范围的异常...
Rectangle rect = dataGridView.GetCellDisplayRectangle(col, row, true);
重要的是,如我所述,选择异常中断选项有助于我确定实际问题。其他人提到的解决方法也可以,但在这种情况下,我能够找到根本原因。

1

我曾经遇到过同样的问题,只是在我的情况下,软件在某些64位系统上运行正常,而在其他系统上则不行。例如,我的笔记本电脑是今年刚购买的索尼VAIO PCG系列,运行64位Windows 7 Home Edition,分辨率为1600 x 900。程序在这里运行得很好。我的同事有一台VAIO SVZ系列,运行64位Windows Professional,分辨率为1920 x 1080,但由于某种原因,在ResumeLayout(false)调用时总是出现静默崩溃。

同样地,在INitializeComponents()子程序顶部注释掉this->SuspendLayout()调用,在底部注释掉this->ResumeLayout(false)调用可以解决问题,现在程序在两个系统上都能正常运行。


0
你使用了一些外部组件吗?
一些不兼容64位的OCX?我曾经使用GdPicture时遇到过同样的问题。 如果是这样,请尝试编译为32位,问题可能会得到解决。

我在我的项目中除了OpenTK没有使用任何其他东西,而且我已经尝试过编译为x86、Any CPU等,但都没有任何区别。一个带有user32.dll互操作的OpenTK应用程序在64位机器上运行得很好,但一旦涉及到Windows Forms,它就会像这样崩溃。 - roastbeef

0

这个问题的简单解决方案是在InitializeComponent()函数的开头删除两个有问题的ResumeLayout()调用和相应的SuspendLayout()调用。尽管窗口上有大量控件,但它似乎对窗口的布局没有任何不良影响。再次强调,这仅适用于64位机器,在Windows XP或7 32位上从未出现过此问题。

我仍然感到困惑为什么ResumeLayout()调用会导致首次崩溃,并且对于这个“解决方案”仍然感到有些不安,但它似乎起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接