未捕获System.Data.SQLite的FileNotFoundExceptions

本文关键字:SQLite FileNotFoundExceptions Data System | 更新日期: 2023-09-27 18:02:17

我在我的项目中使用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);
        }
    }

有什么问题吗?

未捕获System.Data.SQLite的FileNotFoundExceptions

您必须处理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;
    }

您无法捕获由于未找到引用的程序集而生成的异常。

只有使用反射手动加载程序集,才能捕获异常。

检查sqlite程序集是否存在,执行File.Exists() .

在第一种情况下,您无法捕获异常,因为jit一碰到方法就会抛出异常。在第二种情况下,它会抛出你的方法,并在它试图jit DeclareConnection方法时抛出异常。