2

我正在尝试将我的 DLL 的新副本部署到远程服务器上的 GAC,但我需要确定当前运行的任何进程是否有我要替换的 DLL 的加载副本 - 我想重新启动它们,或者在至少告诉用户。

例如,Biztalk 似乎会在第一次使用它们时加载它需要的 DLL,然后替换它们会将旧副本保留在内存中,直到重新启动主机实例 - 作为部署的一部分,我可以轻松地做到这一点。

有没有办法使用 .NET 来判断哪些进程从 GAC 加载了特定的 DLL?

更新:

一些进一步的调查表明 Process Explorer 都具有此功能,而另一个 Sysinternals 工具ListDLL正是我想要做的。我想知道他们是如何做到的,因为我很想在我的应用程序中复制这个功能,而不必包含和屏幕抓取 ListDLL(如果许可证中甚至允许这样做的话)。

4

2 回答 2

2

像这样的工作:

Process[] proc = Process.GetProcesses("<optional machine name>");
ProcessModuleCollection mods = proc[0].Modules;

mods 集合将包含为当前进程加载的每个模块。您可以轻松地遍历 proc 集合,然后 mod 集合并查看是否加载了任何感兴趣的模块,如果是,则可以终止该进程。

于 2009-11-20T14:55:24.437 回答
0

您需要以编程方式还是手动执行此操作?

您可以使用Process Explorer的句柄/DLL 搜索功能手动查找正在使用的模块。

链接文本

更新:

不,我不知道这是如何工作的,除了广泛使用 Win32 和 NT API 的尘土飞扬的角落。

您可以查看一些开源替代方案:

另一个实用程序PSList将列出远程计算机上的进程,并且该页面显示它使用 Windows 性能计数器这样做,这与驱动控制面板/管理工具/性能 MMC 的东西相同。我知道您可以从 .NET 访问这些计数器,但我不知道您是否可以获取已加载的模块或有关进程的其他详细信息。

MSDN 文档说Process.GetProcesses使用性能计数器,所以这可能是要走的路,你只需要弄清楚如何使它工作。如果您手动执行相同的操作,您遇到的任何问题也会发生。您不需要在 Win95/98/ME 机器上执行此操作吗?

WNetAddConnection在查询远程计算机之前,您可能需要在远程计算机上进行身份验证。不过,我不确定.net 等价物是什么。

我猜最坏的情况是您编写了一个在服务器上本地运行的应用程序,并通过套接字或其他方式将结果返回给您。

于 2009-11-19T23:09:47.610 回答