2010-11-18 2 views
0

이것은 이상합니다. 나는 DPI가 96으로 설정되었을 때 XP에서 잘 작동하는 WPF 응용 프로그램을 가지고 있지만 120으로 설정하면 실패합니다. 동일한 결과가있는 두 개의 별도 XP 시스템에서이 작업을 시도했습니다.WPF는 120 DPI에서는 XP에서는 실패하지만 96 DPI에서는 실패합니다.

예외 처리기를로드하기 전에 오류가 초기화 될 때 올바르게 발생합니다.

어떻게 디버깅 할 수 있는지에 대한 조언을 해 줄 수 있습니까? 다음은 이벤트 로그 항목 중 하나입니다.


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() 
+0

우리가 쉽게 읽을 수 있도록 코드 추적 형식으로 코드를 저장하십시오. – Brad

답변

2

해당 컴퓨터에 Visual Studio가 설치되어 있습니까? 그렇다면 디버거 내에서 실행하고 예외가 발생하자마자 중단되도록 구성하는 것이 좋습니다. 디버그 메뉴에서 예외 대화 상자를 열고 공용 언어 런타임 예외 항목을 확장 한 다음 System.IO 섹션을 확장하여 System.IO.FileFormatException 항목을 찾습니다. 첫 번째 열 (Thrown)이 선택되어 있는지 확인하십시오.

내가 제안한 이유는 원래의 예외가 아니라 재현을위한 스택처럼 보이기 때문입니다. 예외는 처리되지 않은 예외를 감지하는 WPF 메시지 루프의 비트 인 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen 메서드에서 발생합니다. 따라서 로그에 표시되는 것은 유용하지 않습니다. 실제로 알고 자하는 것은 원래 WPF가 그것을 잡기 전에 예외가 던져진 곳입니다. 그리고 예외가 발생하자마자 디버거가 멈추도록 요청하면 그렇게 할 수 있습니다.

문제에 대해 더 자세히 설명해야합니다.

해당 옵션이없는 경우 Dispatcher.UnhandledException 이벤트 또는 Application.DispatcherUnhandledException 이벤트에 처리기를 연결하고 나만의 맞춤 로깅 코드를 추가해보십시오. 예외가 원래 어디에서 던져 졌는지에 대한 자세한 정보를 제공 할 수 있습니다.

더 자세한 로깅이 없으면 나에게도 분명한 사실이 있습니다. (길기는하지만) 어느 시스템에도 특별한 글꼴이 설치되어 있습니까?

+0

예 .. 앱을로드하려고 시도하자마자 VS가 "소스 코드가 없습니다"라는 오류 메시지와 함께 바로 충돌했습니다. –

+0

글쎄,하지만 내 포인트는 정말 추락에 대한 스택 추적을보고 싶었던 것이었다. 불행히도, 기본적으로 당신은 그것을 얻지 못할 것입니다 - 당신이 게시 한 비 특정 스택 추적으로 끝납니다. 위에서 말했듯이, 전체 아이디어는보다 유용한 스택 추적을 얻는 것이 었습니다. 이전과 마찬가지로 예외가 발생합니다. 동일한 예외가 발생하기를 기대하기 때문에 예외가 발생하지만 문제가 해결되는 데 도움이 될 수있는 곳을 확인할 수 있습니다. –

0

감사합니다. Inner Exception은 비트 맵 파일 오류로 제한된다는 점에서 도움이되었습니다.

나는 그것이 효과가있을 때까지 프로젝트의 사본을 보냄으로써 결국 그것을 알아 냈다. 문제는 나를 얼굴로 보았습니다. 앱이로드되면 메인 창이로드됩니다. 이 창에 대한 아이콘을 일찍 삭제했는데 성공하지 못했습니다. 나중에 다시 돌아 서서로드 된 창에서 아이콘에 대한 참조를 삭제하기 전까지는 (선량에게 감사합니다), 나는 미쳐 버렸습니다. 아마도 Windows 자원에서 제거 된 아이콘의 사본을 캐시했을 것입니까?

어쨌든 아이콘 편집기 (Axialis IconWorkshop)를 사용하여 가능한 모든 아이콘 형식이 있는지 확인했습니다. 성공하지 못했습니다.

결국 아이콘이없는 상태에서 아이콘을로드하려고 시도합니다.로드가 실패하면 아이콘없이 실행됩니다. 이것은 완벽하지는 않지만 아이콘이 문제를 일으키는 제한된 상황에서 나는 그것을 위해 충돌하는 것을 원하지 않습니다.

사이드 노트에서 이전/낮은 해상도를로드하려고했습니다. 첫 번째 아이콘이 실패하고이 상황에서 작동하면 아이콘 버전.

디버거가이 문제를 정확히 파악하기를 바랍니다.

0

아이콘의 형식을보고 싶을 수도 있습니다.고해상도 256 아이콘이있는 Vista 이전 플랫폼에서 WPF 응용 프로그램 관련 문제가있었습니다. 내 디자인 팀은 이전 플랫폼에서로드 할 수없는 256 아이콘에 PNG 형식을 사용하는 아이콘을 제공했습니다. 일단 그 특정 아이콘이 비트 맵 형식으로 바뀌면 모든 것이 잘되었습니다.