.Net相当于VB6的IsObject for WMI查询

时间:2016-02-15 19:47:06

标签: .net vb.net wmi

我确信我不是第一个遇到这个问题的人。搜索“VB.Net isobject”之类的东西什么都不返回,所以答案可能太明显了,不值得发帖。

我的代码:

Dim colItems As Object
colItems = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)

Dim objItem As Object
For Each objItem In colItems
    If isObject(objItem) Then
        If objItem.StatusCode = 0 Then
            IsOnline = True
            colItems = Nothing
            Exit Function
        End If
    End If
Next

错误:

'IsObject' is not declared. It may be inaccessible due to its protection level.

认为我需要的是

If Not objItem Is Nothing Then

这是对的吗?

2 个答案:

答案 0 :(得分:3)

没有直接等效。 VB6(和is used in VBA)中使用了IsObject来确定Variant是否包含对象引用。

由于Object是VB6的Variant的VB.NET继承者,甚至内置的基本类型(整数,字符串等)都来自ObjectIsObject在VB.NET中毫无意义。

最接近的等值可能是IsReference

答案 1 :(得分:2)

如上所述,IsObject()在.NET中显然不太有用,但考虑到上下文,看起来你想要测试Nothing / null。在这种情况下,这些将起作用

If Not objItem Is Nothing Then ...
' or
If objItem IsNot Nothing Then ...

更重要的是代码不会在Option Strict下编译:

Dim colItems As Object
colItems = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)

Object没有ExecQuery方法,因此代码需要后期绑定;同样适用于objItem.StatusCode

代码通常看起来可能源自脚本。当Object有一个很好的.NET包装器时,不需要使用COM接口并处理WMI和后期绑定。我不知道你在查询什么,这将得到BIOS的序列号:

Option Strict On
Imports System.Management

Public Class WMI
    Friend Shared Function ExecWMIQuery(wmiclass As String, queryItem As String) As String

    Dim retVal As String = ""
    Dim query = String.Format("SELECT {0} FROM {1}", queryItem, wmiclass)

    Using searcher As New ManagementObjectSearcher(query)
        For Each item As ManagementObject In searcher.Get

            Dim p = item.Properties(queryItem)
            If (p IsNot Nothing) AndAlso (p.Value IsNot Nothing) Then
                retVal = p.Value.ToString
                ' should be nothing else...
                Exit For
            End If

        Next
    End Using
    Return retVal
    End Function
End Class

用法:

    Dim mySerial = WMI.ExecWMIQuery("Win32_Bios", "SerialNumber")
    Console.WriteLine(mySerial)

我倾向于小心使用WMI,因为您经常受到制造商选择包含或省略的任何内容的支配,因此需要检查Nothing等等。

更重要的一点是,System.Management公开了类型化的对象和集合,因此您不必声明所有内容As Object,并且可以使用Option Strict来防止更糟糕的事情发生。

另见: