带有winforms和C#的this.Controls.Add()的System.NullReferenceException

时间:2013-05-06 03:01:33

标签: c# winforms user-controls nullreferenceexception

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

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

现在我找到了

失败的行
this.Controls.Add(this.myUserControl);

这是Visual Studio从Forms Designer生成的一行。 “this.myUserControl”是用户控件的一个实例。此用户控件是在此项目中构建的,不包括任何外部组件。刚刚构建了一些标准的UI控件。 .NET错误信息是

  

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

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

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

没有任何改变。它总是在那条线上崩溃。

我在发布它之前在Windows 7 64bit上测试了这个应用程序,这个应用程序有很多用户在Windows 7 64bit上使用它。所以我想我不应该改变任何代码。但我对如何解决这个问题没有任何指导。

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

英语不是我的母语,对我的英语很抱歉。


与用户控件相关的代码,所有这些代码都是从Forms Designer生成的:

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);

2 个答案:

答案 0 :(得分:1)

正如你所说,this.myUserControl不是空的;所以this.Controls可能是个问题。检查System.ComponentModel.IContainer componentsInitializeComponent();可能有一些缺乏或没有初始化。

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

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

答案 1 :(得分:0)

崩溃的堆叠/线路;所以你说你的Designer代码中的这一行是否在堆栈的最顶层,即使你选中了“显示外部代码”?

虽然你已经确认它在相关的行上崩溃了:

this.Controls.Add(this.myUserControl);

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

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

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

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