1

我有一个 DLL,它调用在下面运行的应用程序。此 DLL 由几个其他应用程序/进程同时加载。所以,基本上架构是:

在此处输入图像描述

我的问题是如果使用 DLL 的应用程序崩溃,我想在我的基本应用程序中执行退出序列并退出它。如何检测到此 DLL 不再被任何应用程序使用?有没有我可以跟踪的 DLL 的加载计数之类的东西?另一个小故障是我可能必须通过 C# 应用程序来监控它,但这是另一回事。

4

3 回答 3

1

如果您可以外壳外部程序进行检查,您可以使用这个: http ://technet.microsoft.com/en-us/sysinternals/bb896656

于 2012-07-19T07:23:32.470 回答
1

对于 Windows 中实际发生的情况,您的图像不是一个很好的模型。每个进程都有自己的 DLL 副本。DLL 中的代码在 RAM 中共享,但在其数据中不共享。也有共享数据的方法,但这并不常见,内存映射文件是更典型的方法。

Windows 没有提供廉价的方法来确定是否将 DLL 加载到进程中。也没有通知机制。无论您做什么,都必须首先从流程开始。这也适用于 C#,您可以使用Process.Modules 属性

只需跟踪您知道加载 DLL 的进程就足够了,当进程不再运行时,您可以放心地假设它也不再加载 DLL。使用 Process.Exited 事件或使用 WMI,如本答案所示。

于 2012-07-19T09:26:56.120 回答
0

您可以将 DLL 托管在基本应用程序中,并使用共享部分实现您自己的引用计数,这很容易且经常使用。如前所述,一种可能性是在DLL 入口点内实现引用计数,并根据您的规范检测 DLL_PROCESS_DETACH、DLL_THREAD_DETACH、DLL_PROCESS_DETACH 等。

于 2012-08-10T05:57:40.417 回答