如何知道模块是否加载到系统的任何进程上?C#.
本文关键字:进程 任何 系统 模块 何知道 是否 加载 | 更新日期: 2023-09-27 17:56:27
所以... 有人知道如何制作吗?
我在想这样的事情:
private bool IsModuleLoaded(String ModuleName)
{
bool loaded = false;
Process[] processes = Process.GetProcesses();
ProcessModule myProcessModule = null;
ProcessModuleCollection myProcessModuleCollection;
for (int i = 0; i < processes.Length; i++)
{
try
{
myProcessModuleCollection = processes[i].Modules;
for (int j = 0; j < myProcessModuleCollection.Count; j++)
{
myProcessModule = myProcessModuleCollection[j];
if (myProcessModule.ModuleName.Contains(ModuleName))
{
loaded = true;
break;
}
}
}
catch { loaded = false; }
}
return loaded;
}
但它不起作用,因为每次都返回 true。即使模块未加载到任何进程的内存中。
提前谢谢!.
固定代码:
private bool IsModuleLoaded(String ModuleName)
{
bool loaded = false;
Process[] processes = Process.GetProcesses();
ProcessModule myProcessModule = null;
ProcessModuleCollection myProcessModuleCollection;
for (int i = 0; i < processes.Length; i++)
{
try
{
myProcessModuleCollection = processes[i].Modules;
for (int j = 0; j < myProcessModuleCollection.Count; j++)
{
myProcessModule = myProcessModuleCollection[j];
if (myProcessModule.ModuleName.Contains(ModuleName))
{
loaded = true;
break;
}
}
}
catch { loaded = false; }
if (loaded)
break;
}
return loaded;
}
根据 MSDN,Process.Modules 属性包含已加载的模块。因此,如果模块集合中不存在模块,则不会加载该模块。
好吧,您可以随时使用 linq 来帮助您解决这个问题,一旦它击中一个名字,它就会爆发
private bool IsModuleLoaded2(String ModuleName)
{
var q = from p in Process.GetProcesses()
from m in p.Modules.OfType<ProcessModule>()
select m;
return q.Any(pm => pm.ModuleName.Contains(ModuleName));
}
另外,请记住,如果您在 64 位平台上运行,则必须在 64 位进程中运行它。32 位进程无法访问 64 位进程的位和片段,包括模块列表。我看到您正在捕获一个异常,这可能是我所说的异常,使您的(及以上)代码无效,因为它不会枚举所有进程。