2010-11-18 59 views
0

這很奇怪。我有一個WPF應用程序,在DPI設置爲96時可以在XP中正常工作,但在設置爲120時會失敗。我在兩臺獨立的XP計算機上嘗試了這種方法,結果相同。WPF在XP中以120 DPI失敗,但沒有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 2010-11-18 04:22:32

回答

2

您是否在任何一臺機器上安裝了Visual Studio?如果是這樣,我建議在調試器中運行,並將其配置爲在拋出異常時立即中斷。從「調試」菜單中,打開「例外」對話框,展開Common Language Runtime Exceptions item,然後展開System.IO節以查找System.IO.FileFormatException項。確保檢查第一列(投擲)。

我建議這樣做的原因是,您顯示的堆棧跟蹤看起來像重新堆棧的堆棧,而不是原始異常。 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen方法拋出異常,該方法是檢測未處理的異常的WPF消息循環的位。所以這在日誌中顯示的並不是什麼有用的東西 - 您真正想知道的是在WPF捕獲它之前最初拋出異常的位置。如果您要求調試器在引發該異常時立即停止,那麼您將能夠做到這一點。

這應該在這個問題上提供更多的信息。

如果這不是一個選項,您可以嘗試附加一個處理程序到Dispatcher.UnhandledException事件或Application.DispatcherUnhandledException事件並添加一些自己的自定義日誌記錄代碼。這可能會爲您提供有關異常最初拋出的位置的更多信息。

在沒有更詳細的日誌記錄的情況下,發生在我身上的顯而易見的事情是這樣的(儘管它很長):你在任一系統上安裝了任何不同尋常的字體嗎?

+0

是的.. VS試圖加載應用程序後立即崩潰,「沒有源代碼availabe」,就像錯誤的模糊。 – 2010-11-18 15:04:59

+0

好吧,但我的觀點是我想查看堆棧跟蹤的真正崩潰位置。不幸的是,默認情況下你不會得到這個結果 - 你最終得到了你發佈的非特定堆棧跟蹤。正如我上面所說的,整個想法是獲得更有用的堆棧跟蹤。這個例外與以前一樣「模糊」,因爲我期待看到相同的異常,但是如果我們能夠看到*它從哪裏拋出,那可能有助於解決問題。 – 2010-11-26 00:38:05

0

謝謝你的幫助。內部異常,是一個更多的幫助,它將它限制爲一個位圖文件錯誤。

我最終通過消除項目副本直到它工作,發現了它。這個問題在我的面前出現。當應用程序加載它加載一個主窗口。我很早就刪除了此窗口的圖標,但沒有成功。直到後來我纔回過頭來,也刪除了它裝載的窗口中的圖標(謝天謝地),我瘋了。也許它在Windows資源中緩存了已刪除圖標的副本?

無論如何,我用我們的圖標編輯器(Axialis IconWorkshop)來確保每個可能的圖標格式都存在;沒有成功。

我最終剛剛離開了無圖標的窗口,並嘗試在加載時加載圖標,如果失敗,我只是運行無圖像。這並不完美,但在圖標引起問題的有限情況下,我不希望它爲此而崩潰。

在一個側面說明,我也嘗試加載一個較舊/較低的水庫。版本的圖標,如果第一個失敗,並且在這種情況下工作。

我只是希望調試器能更好地幫助您找出問題所在。

0

你可能想看看你的圖標的格式。我在使用高分辨率256圖標的Vista前平臺上的WPF應用程序出現問題。我的設計團隊提供了一個圖標,該圖標使用PNG格式的256圖標,舊平臺無法加載。一旦該特定的圖標被改爲位圖格式,一切都很好。