我们正在为.NET 4开发WPF应用程序。
有一天,客户告诉我新版本在他的Windows 7机器上无效(应用程序刚刚启动时退出),他在Windows事件查看器中找到了异常日志:
Application: myapp.exe Framework Version: v4.0.30319 Description:
The process was terminated due to an unhandled exception. Exception Info: System.Windows.Markup.XamlParseException
Stack: at System.Windows.Markup.XamlReader.RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri)
at System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
at System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
at System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
at ... (I guess no point to continue...)
这个问题让我抓狂,因为我和其他开发人员都无法在我们的机器上重现它,即使在VirtualBox中安装干净的Windows 7,也无法重现它。
当我们试图找到破坏客户申请的更改时,我们发现了违规的文章。区别在于:
这很好用:
<ComboBox x:Name="comboBoxZoom" Margin="130,10,0,0" HorizontalAlignment="Left" Width="40" FontFamily="Arial" FontSize="12" VerticalAlignment="Top" TabIndex="1" Panel.ZIndex="2" />
这打破了:
<ComboBox x:Name="comboBoxZoom" Style="{StaticResource comboBoxStyle}" Margin="130,10,0,0" HorizontalAlignment="Left" Width="40" FontFamily="Arial" FontSize="12" VerticalAlignment="Top" TabIndex="1" Panel.ZIndex="2" />
基本上差异只是
Style="{StaticResource comboBoxStyle}"
但是这种风格在我们的应用程序的其他部分使用之前没有任何问题!导致此异常的同一文件包含许多其他Style =“{StaticResource someotherstyle}”,它们在客户端计算机上运行良好。
所有这些样式都位于一个文件ControlStyles.xaml中。 comboBoxStyle是从某个网站复制的修改样式,类似于这个: http://social.msdn.microsoft.com/Forums/nl/wpf/thread/53134b87-1a99-4998-a1fb-b3d8a9bd2773
为什么Style =“{StaticResource comboBoxStyle}”使我的应用只在某些机器上崩溃以及如何解决这个错误?
答案 0 :(得分:1)
我遇到了同样的问题,在拔掉头发两天之后,我在C#IRC频道的某个人的帮助下使用Windbg找到了解决方案。
所以在我的情况下,抛出了异常,因为我没有为app.config的跟踪侦听器设置type属性,它与XAML无关,虽然奇怪的是当我在XAML中删除了组合框绑定时,我可以在发布模式下运行程序,但真正的解决方案在app.config中存在。我可以在调试模式下运行该程序。这听起来像是编译器的一个令人讨厌的错误。
因此,在你的app.config中查找可能的疏忽,如果一切正常,那么只需抓住Windbg并自行调试,直到找到异常的根本原因。