从P / Invoke中捕获DllNotFoundException

时间:2009-11-06 10:25:41

标签: c# pinvoke dllimport dllnotfoundexception

找到解决方案的帖子How do I handle a failed DllImport?

我正在编写一个应用程序来检查操作系统版本以执行不同的操作,具体取决于主机是使用Vista系列还是NT系列版本的Windows。如果Vista系列,它加载一些DLL(使用DllImport),但不使用这些。问题是,使用DllImport加载它们会在运行时导致DllNotFoundException,如果在没有这些DLL的旧版本Windows上使用的话。

如何捕获/阻止/忽略DllNotFoundExceptions?尝试在我未处理的异常事件中将异常设置为“已处理”不允许应用继续。

2 个答案:

答案 0 :(得分:2)

我认为您应该能够使用win32 LoadLibrary / GetProcAddress / FreeLibrary和委托(与使用回调函数一样)的“传统”方式。

http://msdn.microsoft.com/en-us/library/d186xcf0.aspx可能是一个起点...

这应该让你开始:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);

[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

然后,您声明一个具有要调用的导出的正确签名的委托,并使用Marshal.GetDelegateForFunctionPointer()从您从GetProcAddress返回的函数指针创建它。

答案 1 :(得分:1)

作为一个选项,您可以在C ++ / CLI中编写某种装饰器组件,它可以使用LoadLibrary或静态链接将所有调用转发到Windows dll,并手动处理这些dll的任何缺失。