Member 12172807 Ответов: 2

Managementobjectsearcher выбрасывает исключение "не найдено"


Я пытаюсь получить информацию о процессоре для своих систем. Он отлично работает в Win 10, но выбрасывает исключение "не найдено" в Win 7. Я хочу использовать один и тот же код в обеих ОС. В Win 7 я хочу обработать исключение, если свойство не найдено. Пожалуйста помочь.



public string GetProcessor(string IPAdd)
       {
           try
           {
               string AddressIP;
               AddressIP = "\\\\" + IPAdd + "\\root\\CIMV2";
               ManagementObjectSearcher searcher = new
               ManagementObjectSearcher(AddressIP, "SELECT * FROM Win32_Processor");
               StringBuilder sb = new StringBuilder();
               foreach (ManagementObject wmi in searcher.Get())
               {
                   try
                   {
                       sb.Append("Device ID: " +
                       wmi.GetPropertyValue("DeviceID").ToString() + Environment.NewLine);
                       
                   }
                   catch
                   {
                       //this.textBox1.Text+=
                       return sb.ToString();
                   }
               }
               return sb.ToString();
           }
           catch (Exception ex)
           {
               return ex.Message;
           }
       }


Что я уже пробовал:

Я попытался проверить, является ли "wmi.GetPropertyValue()" нулевым, а затем выдать вывод как ""

Richard Deeming

По данным MSDN, Win32_Processor класс должен поддерживаться любой ОС от Vista и выше.

Какое именно сообщение об ошибке вы получаете?

2 Ответов

Рейтинг:
2

Member 13652520

Вопрос не в том, почему член 12172807 получает DeviceID, а в том, почему WMI захватывает и обрабатывает исключение до того, как try/catch имеет шанс обработать исключение. Приложение запрашивает и выбрасывает исключение local (с пользовательским интрузивным графическим интерфейсом) в WMI, прежде чем вернуть "управляемое" исключение вызывающей программе.


Рейтинг:
0

Dave Kreskowiak

Почему вы получаете DeviceId? Это просто идентификатор, который используется для уникальной идентификации процессора в многопроцессорной системе. Обычно это просто строка "CPU0". Вот и все.

Проблема с использованием WMI заключается в том, что производители оборудования не обязаны его поддерживать. Это поле, как и многие другие, может быть пустым или нулевым.


Member 12172807

Это не просто DeviceID, пытающийся получить все свойства Win32_Processor. В котором PartNumber, NumberOfEnabledCore и т. д. предоставляют значения в Win 10, но не в Win7. В Win 7 они не встречаются.
Таким образом, чтобы включить запуск кода как на Win 10, так и на Win 7, нужно обработать исключение "не найдено"

Dave Kreskowiak

Ты уже это делаешь. Вы оборачиваете вызов GetPropertyValue в блок Try/Catch. Вы можете просто сделать это своим собственным методом, чтобы вам не приходилось писать один и тот же код снова и снова.