1

我们正在为 .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}" 使我的应用程序仅在某些特定机器上崩溃以及如何修复此错误?

4

1 回答 1

1

我遇到了同样的问题,在拔掉头发两天后,我在 C# IRC 频道的某个人的帮助下想出了使用 Windbg 的解决方案。

因此,在我的情况下,抛出异常是因为我没有为 app.config 的跟踪侦听器设置 type 属性,并且它与 XAML 无关,尽管奇怪的是,当我在 XAML 中删除组合框绑定时,我可以运行程序处于发布模式,但真正的解决方案在于 app.config。不过,我可以在调试模式下正常运行程序。这听起来像是编译器的一个讨厌的错误。

因此,在您的 app.config 中寻找可能的疏忽,如果一切似乎都在那里,那么只需抓住 Windbg 并自行调试它,直到找到异常的根本原因。

于 2013-02-01T11:45:44.967 回答