我尝试创建以查看在进程中加载的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();
}
}
}
}
}
}
这是什么?如何解决这个问题?
答案 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();
}
}
}
}