我有一个DLL,它调用在下面运行的应用程序。此DLL由几个其他应用程序/进程同时加载。 所以,基本架构是:
我的问题是如果使用DLL的应用程序崩溃,我想在我的基本应用程序中执行退出序列并退出它。 如何检测到任何应用程序不再使用此DLL? 有没有像我可以跟踪的DLL的加载计数? 另一个小问题是我可能需要通过C#应用程序来监控它,但这是另一回事。
答案 0 :(得分:1)
如果您可以使用外部程序进行检查,则可以使用以下命令: http://technet.microsoft.com/en-us/sysinternals/bb896656
答案 1 :(得分:1)
您的图片不适合Windows中真正发生的事情。每个进程都有自己的DLL副本。 DLL中的代码在RAM中共享,但不在其数据中共享。有一些方法可以共享数据,但这并不常见,内存映射文件是更典型的方法。
Windows没有提供廉价的方法来查明DLL是否已加载到进程中。也没有通知机制。无论你做什么,它都必须先从流程开始。这也适用于C#,您可以使用Process.Modules property。
只是跟踪你知道加载DLL的进程可能就足够了,当进程不再运行时,你可以安全地假设它不再加载DLL。使用Process.Exited事件或使用WMI,如this answer。
所示答案 2 :(得分:0)
您可以在基本应用程序中托管DLL,并使用共享部分实现您自己的引用计数,简单且经常使用。如前所述,一种可能性是在DLL entry point内实现引用计数,并根据您的规范检测DLL_PROCESS_DETACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH等。