C# 捕获DllNotFoundException不';行不通

C# 捕获DllNotFoundException不';行不通,c#,dll,twain,dllnotfoundexception,C#,Dll,Twain,Dllnotfoundexception,我正在尝试在pc上记录连接的扫描仪 我正在使用https://bitbucket.org/soukoku/ntwain 如果我在服务器上运行我的应用程序,ntwain的一些依赖dll将无法加载,因此我将在运行时加载dll,如果失败,我只想返回一个空列表。在项目参考中不再有对NTwain的参考 问题: 如果我的文件夹中有NTwain.dll和exe,并且我在服务器上运行它,应用程序就会崩溃。它不会返回空列表。如果我删除dll并运行应用程序,将返回空列表 代码: 公共类扫描程序:IDB { 私有枚举

我正在尝试在pc上记录连接的扫描仪

我正在使用
https://bitbucket.org/soukoku/ntwain

如果我在服务器上运行我的应用程序,ntwain的一些依赖dll将无法加载,因此我将在运行时加载dll,如果失败,我只想返回一个空列表。在项目参考中不再有对NTwain的参考

问题: 如果我的文件夹中有NTwain.dll和exe,并且我在服务器上运行它,应用程序就会崩溃。它不会返回空列表。如果我删除dll并运行应用程序,将返回空列表

代码:

公共类扫描程序:IDB
{
私有枚举数据组:uint
{
无=0,
控件=0x1,
图像=0x2,
音频=0x4,
掩码=0xffff,
}
公共字符串名称{get;private set;}
公共字符串ProductFamily{get;private set;}
公共字符串版本{get;private set;}
公共扫描器()
{
Name=String.Empty;
}
公共静态列表getScanners()
{
列表扫描程序=新列表();
尝试
{
Assembly Assembly=Assembly.LoadFrom(Environment.CurrentDirectory+“\\NTwain.dll”);
类型tident=assembly.GetType(“NTwain.Data.TWIdentity”);
Type tsession=assembly.GetType(“NTwain.twainession”);
object appId=tident.GetMethod(“CreateFromAssembly”).Invoke(null,新对象[]{DataGroups.Image,System.Reflection.Assembly.getExecutionGassembly()});
对象会话=Activator.CreateInstance(tsession,appId);
GetMethod(“打开”,新类型[0]).Invoke(会话,null);
对象源=session.GetType().GetMethod(“GetSources”).Invoke(session,null);
foreach(在(IEnumerable)源中的var项)
{
扫描仪=新扫描仪();
scanner.Name=(string)item.GetType().GetProperty(“Name”).GetValue(item,null);
scanner.ProductFamily=(字符串)item.GetType().GetProperty(“ProductFamily”).GetValue(item,null);
对象版本=item.GetType().GetProperty(“版本”).GetValue(item,null);
scanner.Version=(string)Version.GetType().GetProperty(“Info”).GetValue(Version,null);
扫描器。添加(扫描器);
}
返回扫描仪;
}
捕获(例外e)
{
返回新列表();
}
}
}

我想在您的代码中捕获一个DllNotFoundException:

如果你删除了dll,那么

Assembly assembly = Assembly.LoadFrom(Environment.CurrentDirectory + "\\NTwain.dll");
抛出一个DllNotFoundException,该异常被catch块捕获,该块表示返回一个空列表(如您所说)


如果您不删除dll,那么代码将成功地通过上述行。如果通过以下几行启动了另一个线程,并且出现了该线程中未捕获到的错误,那么您的捕获块将不会捕获该错误(无论是什么错误),应用程序将崩溃。

发布堆栈跟踪。我无法在服务器上调试,我只是执行应用程序,而不是它将解决问题,但是你能不能先检查一下DLL是否被找到,如果没有,就返回一个空列表,而不是试图捕获一个异常?这对我来说没有意义。如果dll在那里,它应该尝试获取扫描仪或返回空列表。确定thx以获取信息。有没有一种解决方法可以捕获错误并返回我的列表?首先,您应该尝试找出哪里出了问题(通过生成日志文件)。如果新线程的异常未在该特定线程中捕获,则需要消除该错误-据我所知,无法从另一个线程捕获异常。我非常确定-->tsession.GetMethod(“Open”,新类型[0])。Invoke(session,null);failsPerhaps您可以检查“tsession.GetMethod”(“Open”,新类型[0])”和“session”的返回是否正确,然后再像现在在tsession.GetMethod(“Open”,新类型[0])中一样将所有内容放在一起。Invoke(session,null);。您可以检查作为返回值获取的MethodInfo的属性,并在解析会话对象后对其执行相同的操作。如果其中一个属性不符合预期,则返回空列表。
Assembly assembly = Assembly.LoadFrom(Environment.CurrentDirectory + "\\NTwain.dll");