Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “怎么会这样?”;序列号“;“的财产”;Win32“CDROM驱动器”;类在与WMI分开请求时返回null?_C#_.net_Vb.net_Wmi_Wql - Fatal编程技术网

C# “怎么会这样?”;序列号“;“的财产”;Win32“CDROM驱动器”;类在与WMI分开请求时返回null?

C# “怎么会这样?”;序列号“;“的财产”;Win32“CDROM驱动器”;类在与WMI分开请求时返回null?,c#,.net,vb.net,wmi,wql,C#,.net,Vb.net,Wmi,Wql,当像这样从WMI类Win32\u CDROMDrive获取属性SerialNumber的值时从Win32\u CDROMDrive中选择SerialNumber它通过NullReferenceException执行,除非我将查询更改为SELECT*from Win32\u CDROMDrive。然后在所有属性周围循环,包括SerialNumber,在这种情况下,该属性不为null 由于第一种方法比第二种(不太确定)快,我更喜欢使用它。那么发生了什么?我错过什么了吗? 请注意,它可以与其他属性和类

当像这样从WMI类
Win32\u CDROMDrive
获取属性
SerialNumber
的值时
从Win32\u CDROMDrive中选择SerialNumber
它通过
NullReferenceException
执行,除非我将查询更改为
SELECT*from Win32\u CDROMDrive
。然后在所有属性周围循环,包括
SerialNumber
,在这种情况下,该属性不为null

由于第一种方法比第二种(不太确定)快,我更喜欢使用它。那么发生了什么?我错过什么了吗? 请注意,它可以与其他属性和类完美结合

这是我的代码

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");
更新

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);
第一个方法处理同一类的其他属性,可以毫无例外地提取值。似乎问题只在于
SerialNumber
属性

更新2

问题似乎确实出在
SerialNumber
上,因为在
Win32\u 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\u PhysicalMedia
获取了这个顽皮属性的值,而没有在所有剩余属性周围循环,该类包含了使用此WQL查询的所有连接驱动器(HDD、奇数、软盘等)的较少属性,包括
SerialNumber
属性

从Win32\u PhysicalMedia中选择*

或特定于(CDROM驱动器)

从Win32\u PhysicalMedia中选择*,其中的标记类似于“%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();
或者特定于
CDROMDrive

从Win32\u PhysicalMedia中选择SerialNumber,其中标记为“%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不允许在“代码> >选择< /COD>语句中指定一个记录到(并且只有)
SerialNumber
属性的
CDROMDrive
类?

我刚刚在我的电脑和我的案例上进行了测试,这似乎是因为
SerialNumber
属性在我拥有的唯一实例上为null。看起来,WMI在查找null属性(在我的案例中)时无法正常工作

无论如何,您可以使用来使用WMI,并使用Linq完成所有工作

例如:

WMIHelper helper = new WMIHelper("root\\CimV2");

var data = helper.Query("SELECT * FROM Win32_CDROMDrive").Where(p => p.SerialNum == "yourSerialNum");

尝试更新的2代码,序列不是空的!它在那里,但只有在提取所有属性的值,然后在所需的值周围循环时才能提取是的…似乎存在一个问题,即即使存在非空值,也有空值的实例…奇怪的行为Plus我更想知道原因这种情况的发生超过了它是如何交替发生的。因为我已经得到了序列号,除了(不正确的方法)。