2017-10-17 18 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

私のコードを単純化して新しいコードを書くことはできますか?私は説明がなくてもあなたのコードを理解できるほど専門家ではない。ちょっと – Nichie

+0

私はメソッドにクエリを移動しました。私は2番目のforeachループの代わりにLINQを使用しました。 ProcessModuleCollectionはIQueryableを実装していないため、Cast を使用しました(Whereに必要)。 try catchブロックでLINQを囲みます。process.Moduleは例外をスローします。アイテムが見つかった場合は直接戻り、それ以外の場合は空のEnumerableを返します。 – Greg

関連する問題