我在项目中使用System.Data.SQLite。当输出文件夹中没有System.Data.SQLite dll时,我无法捕获FileNotFoundException(其他异常捕获正常)。这是代码exapmle:
private void button1_Click(object sender, RoutedEventArgs e)
{
try
{
SQLiteConnection conn = new SQLiteConnection();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
MessageBox没有显示。如果我在单独的函数中提取此代码并在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);
}
}
有什么问题?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
您无法捕获由于未找到引用的程序集而产生的异常。
仅当您使用Reflection手动加载程序集时,才能捕获异常。
要检查sqlite程序集是否存在,请执行File.Exists()
。
答案 2 :(得分:0)
在第一种情况下,你无法捕获异常,因为jit在遇到方法时会立即抛出异常。在第二种情况下,它会运行您的方法,并且在尝试jit DeclareConnection
方法时抛出异常。