如何知道模块是否加载到系统的任何进程上?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;
    }

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

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