2009-10-19 165 views
0

我遇到了使用第三方库的情况。在没有安装磁带库的机器上,我收到了以下内容:Unable to load DLL '*.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)。但是,我将调用代码封装在try-catch块中。DLL未找到错误

我试着捕获Exception和DllNotFoundException,但实际上都没有发现错误。该应用程序然后关闭非常。

我想为应用程序捕捉错误,然后继续而不使用第三方功能。

如何防止错误与DLL检查(不知道路径)或优雅地捕捉错误。

编辑:更多详情 这是允许我使用USB设备的第三方应用程序。他们提供了一个.net包装器,用于他们的未管理API(我认为)。我以正常的方式将托管的dll添加到项目中。

编辑:我设法得到有问题的DLL的路径。我正在做一个File.Exisits的DLL和没有进入第二个代码块如果DLL不存在。这似乎工作到目前为止。谢谢您的帮助!

回答

4

在JITter中引发异常,而不是在您的代码中(即在不同的线程中)。这意味着你在这一个方面倒过来。

2

抛出异常的JITter使得这有点棘手。

你可以检查的DLL,但你必须记住 JITter要寻找DLL加载。

在加载任何依赖于该dll的类型之前,您必须检查dll。只要您点击调用任何需要该类型的类型的方法,就会加载类型。 (哇!)。所以基本上你需要确保你不要调用包含在调用需要第三方库的方法的类型中的任何方法。

我为saftey所做的工作是:将所有对DLL的引用都包含在一个永远不会被访问或引用的类型中 - 比方说这是WrapperClass。检查是否存在DLL,然后(如果存在)使用Activator.CreateInstance(...)创建WrapperClass的实例。

请注意,这对我来说一直工作到.net 3.5。据我所知,这不能保证这将不会在未来的版本,甚至修补程序中被破坏。

2

你不说你是如何导入这个第三方库?你是否将它添加到你的项目中并让VS自动为你创建包装?

或者,您使用的DllImport:

[DllImport("thirdParty.dll")] 
static extern int thirdPartyFunction(some params); 

无论哪种方式,这两种方法都不会告诉你多少爱,如果机器上没有安装thirdParty.dll。

你需要做什么叫LateBinding看看这个CodeProject文章怎么做Late binding on native DLLs with C#