C# winforms和C的.Controls.Add()上的System.NullReferenceException#
我用C#开发了一个小型WinForm应用程序。 我已经发布这个应用多年了,很多用户在很多不同的Windows系统上使用它,包括Windows XP、Vista、7、8、32位和64位 但几天前,一位用户报告在Windows7 64位机器上启动应用程序时发生崩溃。因为我无法重现我这边的错误,所以我给他发送了调试版本,可以输出日志信息 现在我已经找到了发生故障的线路C# winforms和C的.Controls.Add()上的System.NullReferenceException#,c#,winforms,user-controls,nullreferenceexception,C#,Winforms,User Controls,Nullreferenceexception,我用C#开发了一个小型WinForm应用程序。 我已经发布这个应用多年了,很多用户在很多不同的Windows系统上使用它,包括Windows XP、Vista、7、8、32位和64位 但几天前,一位用户报告在Windows7 64位机器上启动应用程序时发生崩溃。因为我无法重现我这边的错误,所以我给他发送了调试版本,可以输出日志信息 现在我已经找到了发生故障的线路 this.Controls.Add(this.myUserControl); 这是VisualStudio从表单设计器生成的一行。“
this.Controls.Add(this.myUserControl);
这是VisualStudio从表单设计器生成的一行。“this.myUserControl”是用户控件的实例。此用户控件是在此项目中生成的,不包括任何外部组件。只是用一些标准的UI控件构建的。
.NET错误信息为
“System.NullReferenceException:对象引用未设置为
对象的实例。”
在将this.myUserControl添加到控件之前,我添加了测试它是否为null的代码,它肯定不是null
我尝试过很多方法,比如使用corflags.exe强制它在32位模式下运行,或者将构建目标框架更改为3.5(在2.0之前)
没有什么变化。它总是在那条线上崩溃
在发布之前,我已经在Windows7 64位上测试过这个应用程序,这个应用程序有很多用户在Windows7 64位上使用它。所以我认为我不应该改变任何代码。但我对如何解决这个问题没有任何方向
我应该告诉用户重新安装Windows还是修复.Net Framework?是否有人在Windows 7 64位上遇到此错误
英语不是我的母语,所以对不起我的英语
与用户控件相关的代码,所有这些代码都是从窗体设计器生成的:
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);
如您所述,
this.myUserControl
不为空;所以这个.Controls
可能是问题所在。检查是否存在System.ComponentModel.i容器组件
和初始化组件()
;可能缺少或未初始化某些内容
覆盖OnLayout
或OnPaint
将有助于调试,IsHandleCreated
也可能是发现异常的关键点
最简单的方法是使用designer创建一个新的用户控件,并粘贴您为业务编写的代码。记住将控件命名为与原始控件相同的名称 关于碰撞的堆栈/线;那么您是说设计器代码中有问题的这一行位于堆栈的最顶端,即使您选中了“ShowExternalCode” 尽管您已确认它正在相关线路上崩溃:
this.Controls.Add(this.myUserControl)代码>
我有点怀疑。如果它在该行崩溃,而不是在Controls.Add方法内部,那么似乎只有两种可能性:
1) this.Controls为空-在此之前是否添加了任何控件?如果是这样,这似乎是不可能的
2) 此
为空-这是不可能的
您可以尝试的一件事是发送这个客户代码,它只是一个简单的for,添加一个简单的控件(这不是您的自定义控件)。或者让他们运行其他一些C#forms应用程序。这可能会帮助您缩小范围。您能展示一下如何创建UserControl实例的代码吗。。?请显示您正在使用的代码。。?确保您没有试图引用超出范围的控件。显示您在何处创建UserControl
实例。此控件还控制它引用的内容面板、ListView等。
用户控件包含面板、DataGridView和另一个UserControl,该控件也构建在此项目中,没有任何外部组件。这个用户控件的Designer.cs中的代码太长了。恐怕我不能把它贴在这里。也许是个愚蠢的问题,但你肯定那是一条撞车线吗?我想知道符号/来源是否不完全匹配。。如果确定这一行,它是发生在Add()
方法(.Net code)的某个地方,还是发生在实际的那一行?(你的代码)当那个家伙可以简单地尝试重新安装.Net Framework时,为什么要伤脑筋呢?我猜那里有点乱七八糟。如果这不起作用-请退出。我隐藏用户控件的真实名称和项目的真实名称。我只是将它们替换为“myUserControl”和“ProjectNameSpace”。因为我公司的一些规定。@user2351537:不客气。也许您可以为外部站点(如github)提供完整的代码,这将有助于找出确切的问题所在。