我正在尝试将我的DLL的新副本部署到远程服务器上的GAC,但我需要确定当前正在运行的任何进程是否有我正在替换的DLL的加载副本 - 我想重新启动它们,或者至少告诉用户。
例如,Biztalk似乎在第一次使用时加载了它所需的DLL,然后替换它们将旧副本保留在内存中,直到重新启动主机实例 - 这是我在部署过程中可以轻松完成的事情。
有没有办法告诉使用.NET哪些进程从GAC加载了特定的DLL?
更新:
进一步的调查表明,两个Process Explorer都具有此功能,另一个Sysinternals工具ListDLL完全符合我的要求。我想知道他们是如何做到这一点的,因为我喜欢在我的应用程序中复制这个功能,而不必包含和屏幕清除ListDLL(如果甚至允许在许可证中使用)。
答案 0 :(得分:2)
这样的事情会起作用吗?
Process[] proc = Process.GetProcesses("<optional machine name>");
ProcessModuleCollection mods = proc[0].Modules;
mods集合将包含为当前进程加载的每个模块。您可以轻松地遍历proc集合,然后模拟集合并查看是否加载了任何感兴趣的模块,如果是,则可以终止该过程。
答案 1 :(得分:0)
您需要以编程方式还是手动方式执行此操作?
您可以使用Process Explorer的句柄/ DLL搜索功能手动查找正在使用的模块。
更新
不,我不知道这是如何工作的,除了广泛使用来自Win32和NT API尘土飞扬的角落的东西。
您可以查看一些开源替代方案:
另一个实用程序PSList将列出远程计算机上的进程,该页面表明它使用Windows性能计数器,这与驱动控制面板/管理工具/性能MMC相同。我知道你可以从.NET访问这些计数器,但我不知道你是否可以获得加载的模块或有关这些过程的其他细节。
MSDN文档说Process.GetProcesses
使用性能计数器,所以这可能是要走的路,你只需要弄清楚如何使其工作。如果你手动做同样的事情,那么你遇到的任何问题都会发生。您不需要从Win95 / 98 / ME机器上执行此操作吗?
在查询之前,您可能需要执行WNetAddConnection
之类的操作以在远程计算机上对自己进行身份验证。不过,我不确定.net等价物是什么。
最糟糕的情况我想你是在服务器上编写一个本地运行的应用程序,并通过套接字或其他东西将结果返回给你。