我有一个调用运行在下面的应用程序的DLL。该DLL同时被其他几个应用程序/进程加载。 左右,基本架构是:如何检测DLL没有被任何应用程序使用
我的问题是,如果应用程序(S)使用的DLL崩溃,我想在我的基本应用程序执行的退出序列和退出。 如何检测到这个DLL不再被任何应用程序使用? 有没有像加载计数的DLL,我可以跟踪? 另一个小故障是我可能不得不通过C#应用程序来监视这个,但这是更进一步的事情。
我有一个调用运行在下面的应用程序的DLL。该DLL同时被其他几个应用程序/进程加载。 左右,基本架构是:如何检测DLL没有被任何应用程序使用
我的问题是,如果应用程序(S)使用的DLL崩溃,我想在我的基本应用程序执行的退出序列和退出。 如何检测到这个DLL不再被任何应用程序使用? 有没有像加载计数的DLL,我可以跟踪? 另一个小故障是我可能不得不通过C#应用程序来监视这个,但这是更进一步的事情。
您可以在基本应用程序中托管该DLL,并使用共享部分实现自己的引用计数,这很容易,并且经常使用。如前所述,一种可能性是在DLL entry point内部实现您的参考计数,并根据您的规格检测DLL_PROCESS_DETACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH等。
如果你能外壳外部程序做检查,你可以使用这个: http://technet.microsoft.com/en-us/sysinternals/bb896656
非常感谢,但我不能使用外部程序! :( – Swanand 2012-07-24 09:49:29
你的形象是不是真正发生的事情的Windows一个很好的模式。每个进程都有它自己的DLL副本。 DLL中的代码在RAM中共享,但不是其数据。有多种方法可以共享数据,但这并不常见,内存映射文件是更为典型的方法。
Windows不会以低成本的方式查明DLL是否加载到进程中。也没有通知机制。无论你做什么,它都必须先从流程开始。这也适用于C#,你可以使用Process.Modules property。
只是跟踪你知道加载DLL的进程可能就足够了,当进程不再运行时,你可以放心地认为它没有再加载DLL。使用Process.Exited事件或使用WMI,如this answer所示。
可能的重复[如何检查dll的引用计数?如何知道DLL的加载?](http://stackoverflow.com/questions/3553231/how-to-check-dlls-reference-count-how-to-know-where-the-dll-was-loaded ) – 2012-07-19 07:22:46
如果应用程序崩溃或如果我从任务管理器中杀死它,它执行“FreeLibrary”吗? – Swanand 2012-07-19 07:30:27
您可以在基本应用程序中托管该DLL,并使用共享区段实现自己的引用计数,这很容易并且经常使用。 – mox 2012-07-19 07:47:11