我有一个c#
Windows窗体应用程序,使用.NET 3.5.
我的机器环境如下:
> Visual Studio 2010 Premium,SP1
> Windows 7 Professional,SP1
> 32位处理器
我有一个UserControl导出的自定义控件,其中包含一些其他UserControls.
我在Visual Studio的Windows窗体设计器中调出主要的UserControl,然后我开始点击各种嵌入式的UserControls,并随机更改一些属性,如文本.然后单击保存工具栏按钮.然后我继续对控件的属性进行更多更改,然后单击保存.
在一段时间之后(这不可预测),Visual Studio将显示一个错误对话框.
WinForms设计器显示一个带有“Microsoft Visual Studio”标题的模态对话框,并显示了一个两行消息:“值不能为空”参数名称:上下文“和”确定“按钮.
不幸的是,通过单击确定按钮关闭此对话框后,Visual Studio现在已经损坏了我的Form的设计者生成的代码.恢复代码的唯一方法是备份文件.
我发现唯一的解决方法是将属性窗口中的UserControl设置为false.这不是长期的解决方法,因为我需要这个UserControl可以在我们的生产代码中进行本地化.
我的项目相当简单,没有Web服务等
我尝试使用Visual Studio的另一个实例调试,看看是否可以捕获任何异常,但不会生成异常.没有任何重要的调试输出.
有没有人看到这个问题?寻找建议
更多信息…
我能够成功附加Visual Studio的第二个实例,并确定正在抛出异常. (我不得不取消选中“我的代码”调试选项,启用符号服务器等).
显然,当我单击WinForm设计器中的保存时,System.ArgumentNullException异常发生在System.dll中,方法System.ComponentModel.Design.Serialization.ContextStack.Push(对象上下文)中.所以,context参数是null,这是问题.仍然不知道为什么会发生这种情况.
这是堆栈跟踪:
System.dll!System.ComponentModel.Design.Serialization.ContextStack.Push(object context) + 0x88 bytes
System.Design.dll!System.ComponentModel.Design.Serialization.ResourceCodeDomSerializer.ApplyCacheEntry(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, System.ComponentModel.Design.Serialization.ComponentCache.Entry entry) + 0x10e bytes
System.Design.dll!System.ComponentModel.Design.Serialization.ComponentCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, object value = {ReveilleSystem.UserInterface.BoldLabel}) + 0xf64 bytes
System.Design.dll!System.Windows.Forms.Design.ControlCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, object value = {ReveilleSystem.UserInterface.BoldLabel}) + 0x83 bytes
System.Design.dll!System.ComponentModel.Design.Serialization.CodeDomSerializerBase.SerializeToExpression(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, object value = {ReveilleSystem.UserInterface.BoldLabel}) + 0x173 bytes
System.Design.dll!System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, obj