【问题标题】:Catch DllNotFoundException doesn't work捕捉 DllNotFoundException 不起作用
【发布时间】: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


【解决方案1】:

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

如果你删除 dll 然后

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

抛出一个 DllNotFoundException 被你的 catch 块捕获,它说返回一个空列表(就像你说的那样工作)。

如果您不删除 dll,则代码成功通过上述行。如果通过以下几行启动了不同的线程并且发生了该线程中未捕获的错误,那么您的 catch 块将不会捕获该错误(无论它可能是什么)并且应用程序崩溃。

【讨论】:

  • 好的,谢谢你的信息。是否有解决方案来捕获错误并返回我的列表?
  • 首先您应该尝试找出问题所在(例如通过生成日志文件)。如果新线程的异常没有在该特定线程中捕获,您需要摆脱该错误 - 据我所知,没有办法从另一个线程捕获异常。
  • 我很确定 --> tsession.GetMethod("Open", new Type[0]).Invoke(session, null);失败
  • 也许你可以检查“tsession.GetMethod("Open", new Type[0])”的返回和“会话”的正确性,然后像你现在在 tsession 中所做的那样把所有东西放在一起.GetMethod("Open", new Type[0]).Invoke(session, null);.你可以检查你获得的 MethodInfo 的属性作为返回值,并在解析后对会话对象执行相同的操作。
  • 如果其中一个不符合预期,则返回空列表。
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多