0

アプリケーションに必要な特定のdllを配布しない状況では、アプリケーションはエラーを提供せず、ロードされない(画面に表示される)ことに気づきました。まだ開始していないように動作します。

なぜこれが起こっているのか誰かが知っていますか?

編集:再現する手順:

  1. WPFアプリプロジェクトとクラスライブラリプロジェクト(ReferenceDll)を使用してソリューションを作成します。
  2. WPFアプリプロジェクトの参照をクラスライブラリプロジェクトに追加します。
  3. クラスライブラリで、このメソッドをClass1に追加します

    public intCalculate(int a、int b){return a + b; }

  4. このコードをApp.OnStartupに配置します。

    try
    {
        int result = new ReferenceDll.Class1().Calculate(2, 4);
    }
    catch (Exception ex)
    {
        File.WriteAllText(@"D:\Test\error.txt", ex.ToString());
    }
    
  5. ソリューションをビルドしてから、binフォルダーからReferenceDllを削除します。アプリを実行します。

ファイルは作成されず、アプリは表示されません。メインビューでTrycatchコードを移動しても、一部のボタンクリックイベントでは、Catch {}が起動されず、情報を提供しないメッセージが表示されます。

AppName has stopped working.

デバッグするオプションを提供しますが、これはエンドユーザーには役に立ちません。

4

2 に答える 2

2

Trace.WriteLineステートメントがない場合は、いくつか追加することをお勧めします。いくつかを例外ハンドラーに追加します。また、次の無料ツールを使用してトレースをキャプチャし、その方法で絞り込むことができます。

http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

app.xaml.csのOnstartupメソッドをオーバーライドして、そこからアプリケーションをインスタンス化し、例外をキャッチしてトレースに出力することもできます。

アップデート

アップデートで指定した手順を試しましたが、アプリケーションは問題なく読み込まれました。次に提案するのは、デプロイ先の環境にある.netFrameworkのバージョンを確認することです。それを行うために助けが必要な場合は、このリンクを見てください:

http://msdn.microsoft.com/en-us/kb/kbarticle.aspx?id=318785

アップデート

この質問への回答にあるようなハンドラーにエラーログを入れると、エラーが表示されます。あなたの例でこれを試してみて、うまくいきました。エラーは、何が間違っているかを正確に示しています。

System.IO.FileNotFoundException:ファイルまたはアセンブリ'ReferenceDll、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。ファイル名:'ReferenceDll、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null' at WPFApp.App.OnStartup(StartupEventArgs e)atSystem.Windows.Application。<。ctor>b__1(Object used)atSystem.Windows .Threading.ExceptionWrapper.InternalRealCall(Delegate callback、Object args、Int32 numArgs)at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source、Delegate method、Object args、Int32 numArgs、Delegate catchHandler)

WRN:アセンブリバインディングログがオフになっています。アセンブリバインドの失敗のログを有効にするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)を1に設定します。注:アセンブリのバインドの失敗のログには、パフォーマンスの低下があります。この機能をオフにするには、レジストリ値[HKLM \ Software \ Microsoft \ Fusion!EnableLog]を削除します

WPFウィンドウが起動時にクラッシュするか、起動してもハングしてコンテンツをレンダリングしない

于 2012-11-27T14:40:04.573 に答える
1

これは、例外がセカンダリスレッドでスローされたときに発生する可能性があります。このページの備考セクションを参照してください。

スタンドアロンまたはブラウザーでホストされるWPFアプリケーションは、Applicationクラスを使用して、未処理の例外を検出します(DispatcherUnhandledExceptionを参照)。ただし、Applicationは、Applicationクラスが実行されているのと同じスレッドでスローされた未処理の例外のみを検出できます。通常、アプリケーションには1つのメインユーザーインターフェイス(UI)スレッドがあるため、Applicationクラスの未処理の例外検出動作は適切です。ただし、セカンダリスレッドでスローされた未処理の例外は、メインUIスレッドのApplicationクラスによって自動的に検出されません。

このイベントを使用して、例外 をキャッチ検出し、エラーをログに記録してみてください: AppDomain.UnhandledException Event

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
   Exception e = (Exception) args.ExceptionObject;
   Console.WriteLine("MyHandler caught : " + e.Message);
}

アップデート:

スレッドの問題とは別に、try...catchブロックを間違った場所に置いた場合にも原因となる可能性があります。この例を考えてみましょう。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        Do();

    }

    private void Do()
    {
        try
        {
            int result = new ClassLibrary1.Class1().Calculate(2, 4);
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
        }
    }
}

これにより、Do()が呼び出された行で例外が発生します。これは、ここでCLRがこの時点でアセンブリを解決しようとするためです。例外はキャッチされず、アプリは終了します。

しかし、これを試してみると:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        try
        {
            Do();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine("MyHandler caught by try...catch: " + ex.Message);
        }
    }

    private void Do()
    {
        int result = new ClassLibrary1.Class1().Calculate(2, 4);
    }
}

出力は次のとおりです。

myHandlerがtry...catchによってキャッチされました:ファイルまたはアセンブリ'ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

UnhandledExceptionイベントは、アセンブリが参照されているのと同じ関数でサブスクライブした場合には発生しないことに注意してください。これも機能します:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += new UnhandledExceptionEventHandler(
            (sender, args) =>
            {
                Exception ex = (Exception)args.ExceptionObject;
                Console.WriteLine("MyHandler caught by UnhandledException handler: " + ex.Message);
            });

        Do();
    }

    private void Do()
    {
        int result = new ClassLibrary1.Class1().Calculate(2, 4);
    }

結果:

UnhandledExceptionハンドラーによってキャッチされたMyHandler:ファイルまたはアセンブリ'ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

それが役に立てば幸い。

于 2012-11-27T15:24:38.023 に答える