找到解决方案的帖子:How do I handle a failed DllImport?
我正在编写一个应用程序来检查操作系统版本以执行不同的操作,具体取决于主机是使用Vista系列还是NT系列版本的Windows。如果Vista系列,它加载一些DLL(使用DllImport),但不使用这些。问题是,使用DllImport加载它们会在运行时导致DllNotFoundException,如果在没有这些DLL的旧版本Windows上使用的话。
如何捕获/阻止/忽略DllNotFoundExceptions?尝试在我未处理的异常事件中将异常设置为“已处理”不允许应用继续。
答案 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的任何缺失。