我有一个VB.net Windows程序。它使用VS 2010 Ultimate(版本10.0.10219.1 SP1Rel)编译。在Windows窗体中,有一个TreeView控件。当使用选项/ optimize +编译程序时,程序将崩溃,而Target框架是.Net Framework 4。
我尝试了四组编译选项
一个。选中启用优化,目标框架:.Net Framework 4.
湾取消选中启用优化,目标框架:.Net Framework 4.
C。检查启用优化,目标框架:.Net Framework 3.5
d。取消选中启用优化,目标框架:.Net Framework 3.5。
实际结果:使用#a选项编译的exe崩溃。弹出未处理的异常对话框,下面是异常文本。使用选项#b,#c或#d编译的exe效果很好。
************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.TreeView.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
预期结果:单击树视图复选框时,选项#a的exe编译不应该崩溃。至少用选项#a和#b编译的exe的行为应该是相同的。
比较选项#a和#b的构建输出。唯一的区别是选项/ optimize +和/ optimize-。我猜Vbc.exe没有正确处理优化选项,这导致不同的运行时结果。一个是崩溃,另一个不是。
我怎样才能避免这种崩溃?它是编译工具Vbc.exe的缺陷吗?
在这里的文章(http://msdn.microsoft.com/en-us/magazine/dd419661.aspx)中,它指出在.Net 4中更改了异常框架。我尝试将<legacyCorruptedStateExceptionsPolicy enabled="true"/>
添加到配置文件中。它不起作用。
UPDATE:删除编译输出。添加记录到miscrosoft的问题的链接
我将此问题记录到miscrosoft。 https://connect.microsoft.com/VisualStudio/feedback/details/723973。源代码可以在那里下载。
在项目中,只有一个名为MainUI的表单。它包含一个名为TreeViewDrwRes的树视图控件。 TreeViewUtil类用于扩展具有Indeterminate状态的TreeView控件的Checked按钮。通过使用WIN API调用更新按钮状态图像来修改该行为。