从 P/Invoke 捕获 DllNotFoundException

发布于 2024-08-10 10:52:29 字数 428 浏览 12 评论 0 原文

找到带有解决方案的帖子如何处理DllImport 失败?

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

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

Found post with a solution: How do I handle a failed DllImport?

I'm writing an app that checks the OS version to do different things depending on whether the host is using a Vista-series or NT-series version of Windows. If Vista-series, it loads some DLLs (using DllImport), but doesn't use these otherwise. The problem is, using DllImport to load them will cause a DllNotFoundException at runtime if used on older versions of Windows that don't have those DLLs.

How can I catch / prevent / ignore the DllNotFoundExceptions? Trying to set the exception to "Handled" in my unhandled exception event does not allow the app to continue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一直在等你来 2024-08-17 10:52:29

我认为您应该能够使用 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

I think you should be able to go the "traditional" way with the win32 LoadLibrary/GetProcAddress/FreeLibrary and a delegate (just as you do it with callback functions).

http://msdn.microsoft.com/en-us/library/d186xcf0.aspx might be a starting point...

This should get you started:

[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);

Then you declare a delegate with the correct signature of the export to be called, and use Marshal.GetDelegateForFunctionPointer() to create it from a function pointer you got back from GetProcAddress.

中性美 2024-08-17 10:52:29

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

As an option you could write some sort of decorator component in C++/CLI which would forward all calls to windows dlls using LoadLibrary or static linking and handle manually any absences of those dlls.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文