2010-11-18 15 views
0

これは奇妙です。私は、DPIが96に設定されているときにXPでうまく動作するWPFアプリケーションを持っていますが、120に設定して失敗します。同じ結果を持つ2つの別々のXPマシンでこれを試しました。WPFはXPでは120 DPIで失敗しますが、96 DPIでは失敗します。

例外ハンドラをロードする前に、エラーが初期化時に正しく発生しています。

これをどのようにデバッグするためのヒントを教えてもらえますか?イベントログエントリの1つがここにあります。


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.FileFormatException項目を見つけるためにSystem.IOセクションを展開します。最初の列(Thrown)がオンになっていることを確認します。

私が示唆した理由は、あなたが示したスタックトレースは、元の例外ではなく、再登場のスタックのように見えるということです。例外は、処理されない例外を検出するWPFメッセージループのビットであるMS.Internal.Threading.ExceptionFilterHelper.TryCatchWhenメソッドからスローされています。だから、ログに表示されたことは有用なことではありません。本当に知りたいことは、WPFがそれを捕まえる前に例外が最初にスローされた場所です。また、例外がスローされるとすぐにデバッガに停止を依頼すると、そのことが可能になります。

これは、問題をより詳しく説明します。

これはオプションではない場合は、Dispatcher.UnhandledExceptionイベント、またはApplication.DispatcherUnhandledExceptionイベントにハンドラをアタッチし、独自のカスタムロギングコードを追加してみてください。それは、例外がどこから投げられたのかについて、より多くの情報を提供するかもしれません。

詳細なログがない場合、私には明らかなことがあります(ロングショットですが)。どちらのシステムにも珍しいフォントがインストールされていますか?

+0

はい..アプリケーションを読み込もうとするとすぐにVSがクラッシュし、「ソースコードはありません」というエラーが表示されます。 –

+0

まあ大丈夫ですが、私の主張は、実際にクラッシュした場所のスタックトレースを見たかったということでした。残念ながら、デフォルトでは、それを取得しません - あなたが投稿した非特定のスタックトレースで終わる。上で述べたように、全体のアイデアはより有用なスタックトレースを得ることでした。例外は同じ例外を見ることを期待しているので、以前と同じように "曖昧"になりますが、どこから*スローされたのかが分かると、問題を解決するのに役立ちます。 –

0

ありがとうございました。 Inner Exceptionは、Bitmapファイルエラーに制限されているという点で、より多くの助けになりました。

私は最終的に、それが働くまでプロジェクトのコピーを捨てることによってそれを理解しました。問題は、私の顔に私を主演していた。アプリケーションが読み込まれると、メインウィンドウが読み込まれます。このウィンドウのアイコンを早期に削除しましたが、成功しませんでした。私が戻ってきて、それがロードされたウィンドウのアイコンへの参照を削除した(後でありがとう)まで、後悔していませんでした。おそらく、それはWindowsリソース内の削除されたアイコンのコピーをキャッシュしたでしょうか?

とにかく私たちのアイコンエディタ(Axialis IconWorkshop)を使用して、可能なすべてのアイコン形式が存在することを確認しました。成功なし。

私は結局のところ、アイコンが無くなってしまい、ロード時にアイコンをロードしようとしました。失敗した場合はアイコンなしで実行します。これは完璧ではありませんが、アイコンが問題を引き起こす限られた状況では、私はそれがクラッシュすることは望ましくありません。

さらに、古い/低い解像度を読み込もうとしました。最初のアイコンが表示されない場合はアイコンが表示され、この状態ではアイコンが表示されます。

私は、デバッガがこれを正確に特定するのに役立つことを望みます。

0

あなたのアイコンのフォーマットを見たいかもしれません。私は高解像度256のアイコンでVistaプラットフォーム前のWPFアプリケーションに問題がありました。私の設計チームは、古いプラットフォームでは読み込めなかった256個のアイコンにPNG形式を使用したアイコンを提供しました。その特定のアイコンがビットマップ形式に変更されると、すべてうまくいきました。

関連する問題