4

プロジェクトで System.Data.SQLite を使用しています。出力フォルダーに System.Data.SQLite dll がない場合、FileNotFoundException をキャッチできません (他の例外は正常にキャッチされます)。コード例は次のとおりです。

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            SQLiteConnection conn = new SQLiteConnection();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

メッセージボックスが表示されません。このコードを別の関数で抽出し、この関数呼び出しを try catch でラップすると、例外をキャッチするよりもうまく機能し、MessageBox は次のように表示されます。

    private void DeclareConnection()
    {
        SQLiteConnection conn = new SQLiteConnection();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            DeclareConnection();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

何が問題ですか?

4

3 に答える 3

3

AppDomain.AssemblyResolveイベントを処理する必要があります。

AssemblyResolve イベントをサブスクライブする

AppDomain.CurrentDomain.AssemblyResolve += HandleAssemblyResolve;

c# で x86 / x64 SQLite アセンブリの読み込みを処理するサンプル コードを次に示します。

    public static Assembly HandleAssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (args.Name.Contains("System.Data.SQLite"))
        {
            if (_assembliesResolved)
                return null;

            Assembly returnValue;

            string executingAssemblyPath = Assembly.GetExecutingAssembly().Location;
            executingAssemblyPath = Path.GetDirectoryName(executingAssemblyPath);

            if (Environment.Is64BitProcess)
                executingAssemblyPath = Path.Combine(executingAssemblyPath, @"lib-sqlite\x64\", "System.Data.SQLite.dll");
            else //32 bit process
                executingAssemblyPath = Path.Combine(executingAssemblyPath, @"lib-sqlite\x86\", "System.Data.SQLite.dll");

            returnValue = Assembly.LoadFrom(executingAssemblyPath);

            _assembliesResolved = true;

            return returnValue;
        }

        return null;
    }
于 2013-03-04T08:48:35.703 に答える
0

最初のケースでは、jit がメソッドにヒットするとすぐに例外をスローするため、例外をキャッチできません。2 番目のケースでは、メソッドを jit し、DeclareConnectionメソッドを jit しようとするまでに例外がスローされます。

于 2013-03-04T08:49:56.650 に答える
0

参照されたアセンブリが見つからなかったという事実によって生成された例外をキャッチすることはできません。

リフレクションを使用してアセンブリを手動でロードした場合にのみ、例外をキャッチできます。

sqlite アセンブリが存在するかどうかを確認するには、File.Exists().

于 2013-03-04T08:46:17.623 に答える