如何解决如何知道模块是否在系统的任何进程中加载? C#
| 所以...有人知道怎么做吗? 我在想类似的东西: 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位进程的位和片段,包括模块列表。我看到您正在捕获一个异常,该异常可能是我所说的一个异常,使您的(及以上)代码无效,因为它不会枚举所有进程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。