При получении значения свойства SerialNumber
из класса WMI Win32_CDROMDrive
, подобного этому SELECT SerialNumber FROM Win32_CDROMDrive
, оно проходит NullReferenceException
, если я не изменю запрос на SELECT * FROM Win32_CDROMDrive
. Затем зациклите все свойства, включая SerialNumber
in, который в этом случае не равен нулю.
И поскольку первый метод быстрее второго (не совсем уверен), я предпочитаю его использовать. Так что же происходит? Я что-то пропустил?
Обратите внимание, что он отлично работает с другими свойствами и классами!
Это мой код
string result = "";
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_CDROMDrive");
ManagementObjectCollection collec = searcher.Get();
foreach (ManagementObject obj in collec)
{
result = obj["SerialNumber"].ToString();
break;
}
MessageBox.Show(result);
Это не сработает, если я не поменяю на:
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_CDROMDrive");
Обновление
Первый метод работает с другими свойствами того же класса, и значение может быть извлечено без исключения. Кажется, проблема только в свойстве SerialNumber
Обновление 2
Похоже, что проблема действительно в SerialNumber
, так как зацикливание вокруг всех ненулевых значений свойств Win32_CDROMDrive
выведет SerialNumber
с реальным значением, как объясняет приведенный ниже код:
listView1.Items.Clear();
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_CDROMDrive");
foreach (ManagementObject mo in searcher.Get())
{
foreach (PropertyData pd in mo.Properties)
{
if (pd.Value != null)
listView1.Items.Add(pd.Name).SubItems.Add(pd.Value.ToString());
}
}
Однако, если запрос будет изменен на определенный метод требуемого свойства, он выдаст ту же ошибку!
Обновление 3
Мне удалось получить значение этого непослушного свойства без зацикливания вокруг всех остальных через другой класс Win32_PhysicalMedia
, который содержит меньше свойств для всех подключенных дисков ( HDD, ODD, Floppy, ... ) включая свойство SerialNumber
с использованием этого запроса WQL
SELECT * FROM Win32_PhysicalMedia
Или конкретнее (к CDROMDrive)
SELECT * FROM Win32_PhysicalMedia WHERE Tag Like '%CD%'
Или, если быть точным (SerialNumber
из CDROMDrive
SELECT SerialNumber FROM Win32_PhysicalMedia WHERE Tag Like '%CD%'
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_PhysicalMedia WHERE TAG LIKE '%CD%'");
ManagementObjectCollection collec = searcher.Get();
foreach (ManagementObject obj in collec)
{
Console.WriteLine(obj["SerialNumber"].ToString());
}
Console.Read();
Но я не могу считать это ответом, поскольку мой вопрос заключается в том, почему WQL не позволяет указывать запись внутри оператора SELECT
для (и только для) свойства SerialNumber
класса CDROMDrive