使用winforms和c#在ResumeLayout()上静默崩溃Win7 64位

本文关键字:静默 崩溃 Win7 64位 winforms ResumeLayout 使用 | 更新日期: 2023-09-27 17:52:33

我正在用c#构建一个Windows窗体应用程序,在Windows 7 64位上进行测试时发现了一个无声的崩溃。

它失败的确切行是InitializeComponent()函数末尾附近的this.ResumeLayout(false);。它是Visual Studio从窗体设计器生成的代码的一部分。

没有异常,没有弹出窗口显示程序已经崩溃,什么都没有。一旦到达这一行,它就会停止运行。这只发生在64位。删除这一行,程序可以运行,但不能最大化,并且还有其他一些与窗口属性相关的奇怪之处。

我尝试了从改变构建设置到使用CorFlags.exe的所有方法,没有任何帮助。有什么问题吗?

如果它有区别,我使用OpenTK和GL控件。

使用winforms和c#在ResumeLayout()上静默崩溃Win7 64位

有一个相同的问题,只是在我的情况下,软件在一些64位系统上运行,而不是在其他系统上。例如,我的笔记本电脑是今年刚买的vaio pcg系列。64位Windows 7家庭版,1600 x 900分辨率。程序在这里运行得很好。我的同事有一个vaio svz系列,64位Windows专业版,分辨率为1920 x 1080,由于某种原因,他一直在ResumeLayout(false)呼叫上静音崩溃。

再次,注释出INitializeComponents()子的顶部附近的this->SuspendLayout()调用,以及底部附近的this->ResumeLayout(false)调用修复了这个问题,并且程序现在似乎在两个系统上运行良好。

我在使用ResumeLayout()时遇到了同样的问题。它在几台机器上运行良好,但我有一个用户让它抛出"异常已被调用的目标抛出"。不是很有帮助。不幸的是,它们也隐藏了Exception.StackTrace中的一些细节。我咨询了我们的常驻专家,他认为这是一个调整大小的问题。在DEBUG->Exceptions并选择一切之后,我确切地发现了问题所在。然后,我在一个函数中得到了一个休息,我用来重新定位一些复选框。由于某种原因,这在这个用户的盒子上抛出了一个超出范围的异常…

矩形rect = dataGridView。GetCellDisplayRectangle(col, row, true);

关键是选择异常中断选项帮助我确定了实际的问题。其他人提到的解决方法很好,但在这种情况下,我能够找到根本原因。

是否使用了一些外部组件?
某些OCX与64位不兼容?我在使用GdPicture时遇到了同样的麻烦。如果是,尝试编译为32位,问题就可以解决了。

解决这整个问题的一个简单的方法是在InitializeComponent()函数的开头删除令人不快的ResumeLayout()调用及其相应的SuspendLayout()调用。尽管在窗口上有大量的控件,但它似乎没有对窗口的布局产生不良影响。同样,这只适用于64位机器,在Windows XP或Windows 7 32位机器上不会出现这个问题。

我仍然对为什么ResumeLayout()调用首先会导致无声崩溃感到困惑,并且仍然对"解决方案"感到有点不安,但它似乎已经工作了。