XamlParseException для некоторого определенного StaticResource на некоторых определенных компьютерах

Мы разрабатываем приложение WPF для .NET 4.

Однажды клиент сказал мне, что новая версия не работает (приложение просто закрывается при запуске) на его машине с 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...)

Эта проблема сводит меня с ума, потому что ни я, ни другой разработчик не можем воспроизвести ее на наших машинах, и мы не можем воспроизвести ее даже на чистой установке Windows 7 в VirtualBox.

Когда мы попытались найти изменения, которые сломали приложение для клиента, мы нашли оскорбительный фрагмент. Вот разница:

Это отлично работает:

<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 — это модифицированный стиль, скопированный с какого-то веб-сайта, похожий на этот: " rel="nofollow">http://social.msdn.microsoft.com/Forums/nl/wpf/thread/53134b87-1a99-4998-a1fb-b3d8a9bd2773

Почему Style="{StaticResource comboBoxStyle}" приводит к сбою моего приложения только на определенных компьютерах и как исправить эту ошибку?


person JustAMartin    schedule 01.06.2012    source источник
comment
Ваш клиент прислал вам аварийный дамп? С помощью отладчика аварийного дампа VS2010 или с помощью WinDbg и SOS можно найти текст сообщения XamlParseException. Текст может дать вам подсказку о причине проблемы.   -  person    schedule 02.06.2012
comment
Как создать дамп для приложения .NET 4? В соответствии с этим: msdn.microsoft.com/en-us /library/bb787181(VS.85).aspx Дампы .NET не могут создаваться автоматически.   -  person JustAMartin    schedule 02.06.2012
comment
Дамп для приложений .NET создается так же, как и для других приложений. Если у вас установлен WinDbg на машине, где возникла проблема, подключите WinDbg к процессу приложения, подождите, пока не возникнет проблема, а затем выполните команду .dump /mfth filename.dmp. В качестве альтернативы используйте инструмент Sysinternal procdump (technet.microsoft.com/en-us/sysinternals /dd996900.aspx); обязательно укажите -ma или -mp, чтобы аварийный дамп содержал всю память.   -  person    schedule 02.06.2012
comment
Спасибо, парни. У моего клиента нет WinDbg, но я только что реализовал обработчик исключений, используя этот пример: social.msdn.microsoft.com/Forums/en-GB/clr/thread/ . Посмотрим, куда это меня сейчас приведет.   -  person JustAMartin    schedule 02.06.2012


Ответы (1)


У меня была та же проблема, и после двух дней выдергивания волос я нашел решение, используя Windbg с помощью кого-то на IRC-канале С#.

Итак, в моем случае было выдано исключение, потому что я не установил атрибут type для прослушивателей трассировки app.config, и это не имело ничего общего с XAML, хотя, как ни странно, когда я удалил привязку поля со списком в своем XAML, я мог запустить программа в режиме релиза, но реальное решение крылось в app.config. Однако я мог нормально запустить программу в режиме отладки. Это звучит как неприятная ошибка компилятора.

Так что ищите возможные оплошности в своем app.config, если там вроде все правильно, то просто хватайте Windbg и отлаживайте его самостоятельно, пока не найдете первопричину исключения.

person Mehrdad    schedule 01.02.2013