Catch DllNotFoundException doesn't work

本文关键字:work DllNotFoundException doesn Catch | 更新日期: 2023-09-27 18:18:45

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

我正在使用来自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>();
            }
        }
}

Catch DllNotFoundException doesn't work

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

如果你删除dll,那么

Assembly assembly = Assembly.LoadFrom(Environment.CurrentDirectory + "''NTwain.dll");

抛出DllNotFoundException,该异常由catch块捕获,该块表示返回空列表(按u所说的工作)。

如果你不删除dll,那么代码成功通过上面的行。如果在下面的代码行中启动了一个不同的线程,并且在该线程中发生了一个没有被捕获的错误,那么您的catch块将无法捕获该错误(无论它可能是什么),并且应用程序崩溃。