2017-10-17 37 views
0

我试图创建看看在加载过程中的DLL。但是在使用system.dll获取进程时出现错误。它会抛出错误消息:如何忽略win32异常?模块进程

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

这可能是因为您没有足够的权限来访问系统中的所有进程。 – dcg

+0

放在一些try/catch语句,所以你可以说“我无法读取”,然后移动 – BugFinder

+0

@Nichie我试图运行我的应用程序在admnistrator privelege我也得到错误。 – Nichie

回答

0

这将忽略访问process.Modules引发的异常。

public IEnumerable<string> GetProcessFileName(string searchBy) 
{ 
    foreach(var process in Process.GetProcesses()) 
    { 
     try{ 
      var p = process.Modules.Cast<ProcessModule>() 
       .Where(m => m.FileName.Contains(searchBy)) 
       .Select(x => x.FileName);   
      return p; 
     } 
     catch(Exception e){ 
      //write to log 
      //Console.Write(e);  
     } 
    } 

    return Enumerable.Empty<string>(); 
} 
+0

可以ü简化修复我的代码不写新代码?我没有那么专业,无法解释你的代码。 thx顺便说一句 – Nichie

+0

我把查询移到了一个方法上。我使用LINQ而不是第二个foreach循环。使用Cast 作为ProcessModuleCollection不会实现IQueryable(Where需要)。与try catch块一起包围LINQ,如process.Module将抛出异常。如果找到一个项目,直接返回,否则返回一个空的Enumerable。 – Greg