【发布时间】:2014-08-20 10:24:09
【问题描述】:
我正在尝试在电脑上记录连接的扫描仪。
我正在使用来自https://bitbucket.org/soukoku/ntwain 的 NTwain.dll。
如果我在服务器上运行我的应用程序,一些来自 ntwain 的依赖 dll 无法加载,因此我将在运行时加载 dll,如果它失败,我只想返回一个空列表。项目引用中不再提及 NTwain。
问题: 如果我在带有 exe 的文件夹中有 NTwain.dll 并且我在服务器上运行它,应用程序就会崩溃。它不会返回一个空列表。如果我删除 dll 并运行应用程序,则会返回空列表。
代码:
public class Scanner : IDB
{
private enum DataGroups : uint
{
None = 0,
Control = 0x1,
Image = 0x2,
Audio = 0x4,
Mask = 0xffff,
}
public string Name { get; private set; }
public string ProductFamily { get; private set; }
public string Version { get; private set; }
public Scanner()
{
Name = String.Empty;
}
public static List<Scanner> getScanners()
{
List<Scanner> scanners = new List<Scanner>();
try
{
Assembly assembly = Assembly.LoadFrom(Environment.CurrentDirectory + "\\NTwain.dll");
Type tident = assembly.GetType("NTwain.Data.TWIdentity");
Type tsession = assembly.GetType("NTwain.TwainSession");
object appId = tident.GetMethod("CreateFromAssembly").Invoke(null, new object[] { DataGroups.Image, System.Reflection.Assembly.GetExecutingAssembly() });
object session = Activator.CreateInstance(tsession, appId);
tsession.GetMethod("Open", new Type[0]).Invoke(session, null);
object sources = session.GetType().GetMethod("GetSources").Invoke(session, null);
foreach (var item in (IEnumerable)sources)
{
Scanner scanner = new Scanner();
scanner.Name = (string)item.GetType().GetProperty("Name").GetValue(item, null);
scanner.ProductFamily = (string)item.GetType().GetProperty("ProductFamily").GetValue(item, null);
object version = item.GetType().GetProperty("Version").GetValue(item, null);
scanner.Version = (string)version.GetType().GetProperty("Info").GetValue(version, null);
scanners.Add(scanner);
}
return scanners;
}
catch (Exception e)
{
return new List<Scanner>();
}
}
}
【问题讨论】:
-
发布堆栈跟踪。
-
我无法在服务器上调试,我只是执行应用程序
-
不是说它会解决问题,但是你能不能也简单地检查一下是否首先找到了 DLL,如果没有,则返回一个空列表,而不是尝试捕获异常?
-
这对我来说没有意义。如果 dll 在那里,它应该尝试获取扫描仪或返回一个空列表。
标签: c# dll twain dllnotfoundexception