WPF дает сбой в XP с 120 DPI, но не с 96 DPI - PullRequest
0 голосов
/ 18 ноября 2010

Это странно. У меня есть приложение WPF, которое прекрасно работает в XP, когда DPI установлено на 96, но не удается установить его на 120. Я пробовал это на двух отдельных машинах XP с одинаковыми результатами.

Ошибка при инициализации до загрузки моего обработчика исключений.

Можете ли вы дать мне несколько советов, как я могу это отладить? Вот одна из записей в журнале событий.


Event Type: Error
Event Source:   .NET Runtime
Event Category: None
Event ID:   1026
Date:       11/17/2010
Time:       7:37:15 PM
User:       N/A
Computer:   EXIDA-100A3799C
Description:
Application: exSILentia3.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileFormatException
Stack:
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   at System.Threading.ExecutionContext.runTryCode(System.Object)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(System.Object)
   at System.Windows.Application.RunInternal(System.Windows.Window)
   at System.Windows.Application.Run(System.Windows.Window)
   at exSILentia3.Application.Main()

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

У вас установлена ​​Visual Studio на любой из рассматриваемых машин?Если это так, я бы порекомендовал запустить его в отладчике и настроить его на разрыв, как только будет сгенерировано исключение.В меню «Отладка» откройте диалоговое окно «Исключения», разверните элемент Общеязыковые исключения времени выполнения , а затем разверните раздел System.IO, чтобы найти элемент System.IO.FileFormatException.Убедитесь, что первый столбец (Брошенный) отмечен.

Причина, по которой я предлагаю это, заключается в том, что показанная вами трассировка стека выглядит как стек для повторного броска, а не как исходное исключение.Исключение выдается из метода MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen, который является битом цикла сообщений WPF, который обнаруживает необработанные исключения.Так что это бесполезная вещь, которую нужно показывать в журнале - что вы действительно хотите знать, так это то, откуда изначально было сгенерировано исключение до того, как WPF его перехватил.И вы сможете это сделать, если попросите отладчик остановиться, как только появится это исключение.

Это должно пролить больше света на проблему.

Если это не вариантВы можете попытаться присоединить обработчик к событию Dispatcher.UnhandledException или к событию Application.DispatcherUnhandledException и добавить свой собственный код регистрации.Это может дать вам больше информации о том, откуда изначально было сгенерировано исключение.

При отсутствии более подробного ведения журналов мне приходит на ум очевидная вещь (хотя это и далеко): есть ли у васкакие-нибудь необычные шрифты установлены в любой системе?

0 голосов
/ 21 июля 2011

Вы можете посмотреть формат ваших иконок.У меня были проблемы с приложением WPF на платформах до Vista со значком 256 пикселей высокого разрешения.Моя команда дизайнеров предоставила значок, который использовал формат PNG для значка 256, который старые платформы не могли загрузить.Как только этот конкретный значок был изменен на растровый формат, все стало хорошо.

0 голосов
/ 18 ноября 2010

Спасибо за вашу помощь.«Внутреннее исключение» стало для меня дополнительной помощью в том, что оно ограничивалось ошибкой растрового файла.

В конце концов я понял это, потратив копию проекта, пока он не заработал.Проблема была в главной роли мне в лицо.Когда приложение загружается, оно загружает главное окно.Я удалил значок для этого окна на раннем этапе, но безуспешно.Только позже я вернулся назад и также удалил ссылку на значок в окне, которое оно загрузило (слава богу), я сходил с ума.Возможно, он кэшировал копию удаленного значка в ресурсах Windows?

В любом случае, я использовал наш редактор значков (Axialis IconWorkshop), чтобы убедиться, что присутствуют все возможные форматы значков;безуспешно.

В конце концов я просто оставил окно без значков и попытался загрузить значок при загрузке, если это не удалось, я просто запустил без значков.Это не идеально, но в ограниченных ситуациях, когда значок вызывает проблему, я не хочу, чтобы он вылетал из-за этого.

Кстати, у меня также была попытка загрузить более старую / более низкую версию.Рез.версия иконки, если первая не работает, и она работает в этой ситуации.

Я просто хотел бы, чтобы отладчик больше помог определить это.

...