Process 情報の取得に関するメモ2

WMI を使用して Process 情報を取得する際に LINQ を使用しようとすると

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();

var query = from proc in queryCollection1 select proc;
foreach (var process in query)
{
   …
}

エラー    1    ソース型 ‘System.Management.ManagementObjectCollection’ のクエリ パターンの実装が見つかりませんでした。’Select’ が見つかりません。範囲変数 ‘proc’ の型を明示的に指定してください。    C:\Users\uchukamen\Documents\Visual Studio 2008\Projects\WpfApplication6\WpfApplication6\Window1.xaml.cs    140    38    WpfApplication6

というエラーになる。

回避方法は、範囲変数 proc の型を明示的に指定するために、queryCollection1.Cast<ManagementObject>()  としてあげるとうまくいった。うむむむむ・・・

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();

var query = from proc in queryCollection1.Cast<ManagementObject>() select proc;
foreach (var process in query)
{
    Console.WriteLine(process["ProcessId"] + ":");
    Console.WriteLine(process["Name"] + ":");
    Console.WriteLine(process["KernelModeTime"] + ":");
    Console.WriteLine(process["UserModeTime"] + ":");
}

——

もうちょっと見やすく?すると、IEnumerable<ManagementObject> にキャストしてくれるということ。

ManagementObjectSearcher query1 = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ManagementObjectCollection queryCollection1 = query1.Get();
IEnumerable<ManagementObject> procQuery = queryCollection1.Cast<ManagementObject>();

var procs = from proc in procQuery select proc;

foreach (var process in procs)
{
    Console.WriteLine(process["ProcessId"] + ":");
    Console.WriteLine(process["Name"] + ":");
    Console.WriteLine(process["KernelModeTime"] + ":");
    Console.WriteLine(process["UserModeTime"] + ":");
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です