如何忽略win32异常?模块流程

时间:2017-10-17 08:47:17

标签: c# windows com

我尝试创建以查看在进程中加载​​的dll,但在使用system.dll获取进程时出错。它抛出此错误消息:

  

System.ComponentModel.Win32Exception:'无法枚举过程模块。'

我的代码:

using System;
using System.Diagnostics;
using System.Threading;

namespace dll
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] processlist = Process.GetProcesses();

            foreach (Process process in processlist)
            {
                foreach (ProcessModule module in process.Modules)
                {
                    if (module.FileName.Contains("foo.dll"))
                    {
                        Console.WriteLine(module.FileName);
                        Console.ReadLine();
                    }
                }
            }
        }
    }
}
这是什么?如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这不是最终答案,但在评论中更适合。

尝试使用此代码捕获异常并将其打印到控制台。然后,您可以在控制台中看到完整的堆栈跟踪。使用此堆栈跟踪,您可以进一步解决错误。

您可能尝试访问您无法访问的MainModule。

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
namespace dll {
    class Program {
        static void Main(string[] args) {
            try {
                Process[] processlist = Process.GetProcesses();
                foreach(Process process in processlist) {
                    foreach(ProcessModule module in process.Modules) {
                        if(module.FileName.Contains("foo.dll")) {
                            Console.WriteLine(module.FileName);                           
                        }

                    }
                }
            }
            catch(Win32Exception ex) {
                Console.WriteLine(ex.ToString());
            }
            Console.ReadLine();
        }
    }
}

这行可能会失败:foreach(ProcessModule module in process.Modules)所以你知道它无法访问一个或多个模块。可能是由于系统限制。

如果您只想检查模块,因此接受并非所有模块都已经过检查,那么您可以这样做。

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
namespace dll {
    class Program {
        static void Main(string[] args) {
            int noErrorCount = 0;
            int errorCount = 0;
            Process[] processlist = Process.GetProcesses();
            foreach(Process process in processlist) {

                try {
                    foreach(ProcessModule module in process.Modules) {
                        if(module.FileName.Contains("foo.dll")) {
                            Console.WriteLine(module.FileName);
                        }
                        noErrorCount++;
                    }
                }
                catch(Win32Exception ex) {
                    errorCount++;
                }
            }
            Console.WriteLine("Modules checked: " + noErrorCount);
            Console.WriteLine("Modules with error(not checked): " + errorCount);
            Console.ReadLine();
        }
    }
}

无限循环中的代码

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
namespace dll {
    class Program {
        static void Main(string[] args) {
            try {
                while(true) {
                    int noErrorCount = 0;
                    int errorCount = 0;
                    Process[] processlist = Process.GetProcesses();
                    foreach(Process process in processlist) {

                        try {
                            foreach(ProcessModule module in process.Modules) {
                                if(module.FileName.ToLower().Contains("Kernel32.dll".ToLower())) {
                                    Console.WriteLine(module.FileName);
                                }
                                //Console.WriteLine(module.FileName);
                                noErrorCount++;
                            }
                        }
                        catch(Win32Exception ex) {
                            errorCount++;
                        }
                    }
                    Console.WriteLine("Modules checked: " + noErrorCount);
                    Console.WriteLine("Modules with error(not checked): " + errorCount);
                }
            }
            catch(Exception ex) {
                Console.WriteLine(ex.ToString());
                Console.ReadLine();
            }
        }
    }
}