0

这很奇怪。我有一个 WPF 应用程序,当 DPI 设置为 96 时,它在 XP 中运行良好,但它设置为 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()
4

3 回答 3

2

Do you have Visual Studio installed on either of the machines in question? If so, I'd recommend running within the debugger, and configuring it to break as soon as the exception is thrown. From the Debug menu, open the Exceptions dialog, expand the Common Language Runtime Exceptions item, and then expand the System.IO section to find the System.IO.FileFormatException item. Ensure the first column (Thrown) is checked.

The reason I suggest this is that the stack trace you've shown looks like the stack for a rethrow, rather than the original exception. The exception is being thrown from the MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen method, which is the bit of the WPF message loop that detects unhandled exceptions. So that's not a useful thing to have shown up in the log - what you really want to know is where the exception was originally thrown from before WPF caught it. And you'll be able to do that if you ask the debugger to stop as soon as that exception is thrown.

That should shed more light on the issue.

If that's not an option, you might try attaching a handler to the Dispatcher.UnhandledException event, or the Application.DispatcherUnhandledException event and adding some custom logging code of your own. That might provide you with more information about where the exception was originally thrown from.

In the absence of more detailed logging, the obvious thing that occurs to me is this (although it's a long shot): do you have any unusual fonts installed on either system?

于 2010-11-18T14:15:32.300 回答
0

Thank you, for your help. The Inner Exception, was a touch more help in that it limited it to a Bitmap file error.

I eventually figured it out by gutting the copy of the project until it worked. The problem was starring me in the face. When the app loads it loads a main window. I deleted the Icon for this window early on, with no success. It wasn't until later that I circled back and also deleted the reference to the icon in the window that it loaded (Thank goodness), I was going insane. Perhaps it cached a copy of the removed icon in the Windows resources?

Anyway, I used our icon editor (Axialis IconWorkshop) to make sure every possible icon format was present; with no success.

I eventually just left the window iconless, and attempt to load the icon at load, if it fails, I just run iconless. This is not perfect, but in the limited situations where the icon causes a problem, I don't want it to crash for that.

On a side note, I had it also try to load an older/lower res. version of the icon, if the first one fails, and that does work in this situation.

I just wish the debugger was more help in pinpointing this.

于 2010-11-18T15:13:34.420 回答
0

You may want to look at the format of your icons. I had issues with a WPF app on pre-Vista platforms with the high res 256 icon. My design team supplied an icon which used PNG format for the 256 icon which older platforms couldn't load. Once that particular icon was changed to the bitmap format everything was fine.

于 2011-07-21T00:08:43.463 回答