2

我用 C# 开发了一个小型 WinForm 应用程序。我已经发布了这个应用程序多年,很多用户在许多不同的 Windows 系统上使用它,Windows XP、Vista、7、8、32 位和 64 位。

但是几天前,一位用户在 Windows 7 64 位计算机上启动应用程序时报告了崩溃。因为我无法重现我这边的错误,所以我给他发了可以输出日志信息的调试版本。

现在我找到了失败的线路

this.Controls.Add(this.myUserControl);

这是 Visual Studio 从窗体设计器生成的一行。“this.myUserControl”是用户控件的一个实例。此用户控件内置于本项目中,不包含任何外部组件。只是用一些标准的 UI 控件构建的。.NET 错误信息是

“System.NullReferenceException:对象引用未设置为对象的实例。”

我已经添加了代码来测试 this.myUserControl 在添加到控件之前是否为空,它绝对不是空的。

我尝试了很多方法,比如使用 corflags.exe 强制它以 32 位模式运行或将构建目标框架更改为 3.5(在它是 2.0 之前)

没有什么变化。它总是在那条线上崩溃。

在发布之前我已经在 Windows 7 64bit 上测试过这个应用程序,并且这个应用程序有很多用户在 Windows 7 64bit 上使用它。所以我认为我不应该更改任何代码。但我对如何解决这个问题没有任何方向。

我应该告诉用户重新安装 Windows 还是修复 .Net Framework?有人在 Windows 7 64bit 上遇到此错误吗?

英语不是我的母语,所以对我的英语感到抱歉。


与用户控件相关的代码,所有这些代码都是从窗体设计器生成的:

private MyUserControl myUserControl;

this.myUserControl = new ProjectNameSpace.MyUserControl();
this.myUserControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.myUserControl.Location = new System.Drawing.Point(12, 80);
this.myUserControl.Name = "myUserControl";
this.myUserControl.Size = new System.Drawing.Size(775, 412);
this.myUserControl.TabIndex = 2;
this.myUserControl.Resize += new System.EventHandler(this.myUserControl_Resize);

this.Controls.Add(this.myUserControl);
4

2 回答 2

1

正如你所说,this.myUserControl不为空;所以this.Controls可能是问题所在。检查System.ComponentModel.IContainer componentsInitializeComponent(); 可能缺少某些东西或未初始化。

覆盖OnLayoutOnPaint有助于调试,IsHandleCreated也可能是找出异常情况的关键点。

最简单的方法是使用设计器创建一个新的用户控件,然后粘贴您为业务编写的代码。请记住将控件命名为与原始控件相同。

于 2013-05-06T03:37:42.933 回答
0

至于崩溃的堆栈/行;所以你说你的设计器代码中有问题的这一行位于堆栈的最顶端,即使你选中了“显示外部代码”?

尽管您已经确认它在有问题的线路上崩溃:

this.Controls.Add(this.myUserControl);

我有点怀疑。如果它在那条线上崩溃,而不是Controls.Add 方法内部,那么似乎只有两种可能性:

1) this.Controls 为 null - 在此之前添加了任何控件吗?如果是这样,那似乎是不可能的。

2)this为空 - 这是不可能的..

您可以尝试的一件事是发送此客户代码,这只是一个简单的操作,添加一个简单的控件(这不是您的自定义控件)。或者让他们运行其他一些 C# 表单应用程序。这可能会帮助您缩小范围。

于 2013-05-06T03:54:38.100 回答