如何知道模块是否加载到任何系统进程? C#

时间:2011-05-16 09:23:15

标签: c# process module

所以......有人知道怎么做吗?

我在思考像:

    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;
    }

2 个答案:

答案 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位进程的各个部分,包括模块列表。我看到你正在捕获一个可能是我所说的异常,使你的(及以上)代码无效,因为它不会枚举所有进程。