我遇到了使用第三方库的情况。在没有安装库的机器上,我得到的结果是:Unable to load DLL '*.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
。但是,我将调用代码包装在try-catch块中。
我已经尝试捕获Exception和DllNotFoundException,但实际上都没有捕获错误。该应用程序然后非正常地关闭。
我希望该应用能够捕获错误,然后继续而不使用第三方功能。
如何通过dll检查阻止错误(不知道路径)或正常捕获错误。
编辑:更多细节 这是第三方应用程序,允许我使用USB设备。他们为他们未经管理的api提供了一个.net包装器(我想)。我以正常的方式将托管的dll添加到项目中。
编辑:我设法为有问题的dll找到了一条路径。我在dll上做一个File.Exisits,如果dll不存在则不输入代码块。到目前为止,这似乎是有效的。谢谢你的帮助!
答案 0 :(得分:4)
异常是在JITter中引发的,而不是在你的代码中(即,在不同的线程上)。这意味着你在这个问题上面对黄油。
答案 1 :(得分:2)
抛出异常的JITter使得这有点棘手。
你可以查看dll,但是你必须记住 时JITter要查找要加载的dll。
在加载任何依赖于该dll的类型之前,您必须检查dll。只要您点击调用任何需要该类型的类型的方法,就会加载类型。 (哇!)。因此,基本上您需要确保不调用调用需要第三方库的方法的类型中包含的任何方法。
我为saftey所做的是:以永远不会被访问或直接引用的类型包装对DLL的任何引用 - 假设这是WrapperClass
。检查DLL是否存在,然后(如果存在),使用Activator.CreateInstance(...)
创建WrapperClass
的实例。
请注意,这对我有用,直到.net 3.5。据我所知,无法保证在将来的版本中,甚至修补程序都不会破坏它。
答案 2 :(得分:2)
您没有说明如何导入此第三方库?您是否已将其添加到项目中并让VS自动为您创建包装器?
或者您使用的是DLLImport:
[DllImport("thirdParty.dll")]
static extern int thirdPartyFunction(some params);
如果机器上没有安装thirdParty.dll,这两种方法都不会给你太多爱。
您需要执行所谓的LateBinding,请查看此CodeProject文章,了解如何执行Late binding on native DLLs with C#