所以......有人知道怎么做吗?
我在思考像:
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;
}
答案 0 :(得分:1)
根据MSDN,Process.Modules属性包含已经加载的模块。因此,如果 Modules 集合中没有模块,则不会加载它。
答案 1 :(得分:1)
好吧,你可以随时使用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位进程的各个部分,包括模块列表。我看到你正在捕获一个可能是我所说的异常,使你的(及以上)代码无效,因为它不会枚举所有进程。