快速的问题。 我想知道在我的应用程序正在执行的系统中是否存在一个DLL。
这在C#中可能吗? (可以在所有的Windows操作系统上运行?)
对于DLL我的意思是一个非.NET的经典的DLL(一个Win32的DLL)
(基本上我想做一个检查,因为我使用的DLL可能会或可能不会出现在用户系统上,但我不希望应用程序崩溃而没有警告,当这不存在:P)
调用LoadLibrary
API函数:
[DllImport("kernel32", SetLastError=true)] static extern IntPtr LoadLibrary(string lpFileName); static bool CheckLibrary(string fileName) { return LoadLibrary(fileName) == IntPtr.Zero; }
调用LoadLibrary。
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
我假设这是一个PInvoke电话?
如果是这样的话,最简单的方法是确定是否存在,就是调用并捕获如果文件不存在的异常。
[DllImport("some.dll")] private static void SomeMethod(); public static void SomeMethodWrapper() { try { SomeMethod(); } catch (FileNotFoundException) { // Do Nothing } }
其实它不会抛出FileNotFoundException 。
另外对于那个需要在多个地方检查路径的LoadLibrary
.net中有一个标准异常,它是从TypeLoadException派生的,即DllNotFoundException 。
最好的方法是在try..catch中包装方法/ PInvoke调用,并处理DllNotFoundException,因为.net将检查应用程序路径以及作为PATH OS环境变量一部分设置的任何其他路径。
[DllImport("some.dll")] private static void SomeMethod(); public static void SomeMethodWrapper() { try { SomeMethod(); } catch (DllNotFoundException) { // Handle your logic here } }