Vb.net 我们如何使这段代码在选项严格的情况下运行?

Vb.net 我们如何使这段代码在选项严格的情况下运行?,vb.net,Vb.net,此代码将检索CPU id和主板id。如何确保即使在启用option strict时也能正常工作 为什么这会成为一个问题 好吧,让我想想。wmi的类型是对象。wmi不一定支持InstancesOf和SerialNumber等方法 那我们怎么才能把它拔出来呢 我认为我们从GetObject得到的对象不仅仅是纯对象。我认为我们应该使用ctype或直接将其转换为更合适的类型。更合适的类型将支持InstancesOf、SerialNumber等方法 但是,适当的类型是什么?您可以从System.Manag

此代码将检索CPU id和主板id。如何确保即使在启用option strict时也能正常工作

为什么这会成为一个问题

好吧,让我想想。wmi的类型是对象。wmi不一定支持InstancesOf和SerialNumber等方法

那我们怎么才能把它拔出来呢

我认为我们从GetObject得到的对象不仅仅是纯对象。我认为我们应该使用ctype或直接将其转换为更合适的类型。更合适的类型将支持InstancesOf、SerialNumber等方法

但是,适当的类型是什么?

您可以从System.Management.dll程序集中托管的WMI类使用。
(您需要添加适当的引用)

通过这种方式,您可以将SystemSerialNumber写为

Public Class Form1  
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lblSystemSerialNumbers.Text = SystemSerialNumber()
        lblCpuIds.Text = CpuId()
    End Sub

    Private Function SystemSerialNumber() As String
        ' Get the Windows Management Instrumentation object.
        Dim wmi As Object = GetObject("WinMgmts:")

        ' Get the "base boards" (mother boards).
        Dim serial_numbers As String = ""
        Dim mother_boards As Object = wmi.InstancesOf("Win32_BaseBoard")
        For Each board As Object In mother_boards
            serial_numbers &= ", " & board.SerialNumber
        Next board
        If serial_numbers.Length > 0 Then serial_numbers = serial_numbers.Substring(2)

        Return serial_numbers
    End Function

    Private Function CpuId() As String
        Dim computer As String = "."
        Dim wmi As Object = GetObject("winmgmts:" & _
            "{impersonationLevel=impersonate}!\\" & _
            computer & "\root\cimv2")
        Dim processors As Object = wmi.ExecQuery("Select * from Win32_Processor")

        Dim cpu_ids As String = ""
        For Each cpu As Object In processors
            cpu_ids = cpu_ids & ", " & cpu.ProcessorId
        Next cpu
        If cpu_ids.Length > 0 Then cpu_ids = cpu_ids.Substring(2)

        Return cpu_ids
    End Function
End Class
CpuId函数稍微复杂一点,因为您希望设置模拟标志,但仍然可以围绕WMI接口的网络包装器类编写方法

Private Function SystemSerialNumber(computer As String) As String

    Dim wmi = New ManagementObjectSearcher(computer & "\root\cimv2", "select * from Win32_BaseBoard")

    Dim boards = New List(Of String)()
    For Each board In wmi.Get()
        Dim temp = board.Properties("SerialNumber").Value?.ToString()
        If Not String.IsNullOrEmpty(temp) Then
            boards.Add(temp)
        End If
    Next board
    Return String.Join(", ", boards)
End Function
您可以使用System.Management.dll程序集中托管的WMI类中的。
(您需要添加适当的引用)

通过这种方式,您可以将SystemSerialNumber写为

Public Class Form1  
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lblSystemSerialNumbers.Text = SystemSerialNumber()
        lblCpuIds.Text = CpuId()
    End Sub

    Private Function SystemSerialNumber() As String
        ' Get the Windows Management Instrumentation object.
        Dim wmi As Object = GetObject("WinMgmts:")

        ' Get the "base boards" (mother boards).
        Dim serial_numbers As String = ""
        Dim mother_boards As Object = wmi.InstancesOf("Win32_BaseBoard")
        For Each board As Object In mother_boards
            serial_numbers &= ", " & board.SerialNumber
        Next board
        If serial_numbers.Length > 0 Then serial_numbers = serial_numbers.Substring(2)

        Return serial_numbers
    End Function

    Private Function CpuId() As String
        Dim computer As String = "."
        Dim wmi As Object = GetObject("winmgmts:" & _
            "{impersonationLevel=impersonate}!\\" & _
            computer & "\root\cimv2")
        Dim processors As Object = wmi.ExecQuery("Select * from Win32_Processor")

        Dim cpu_ids As String = ""
        For Each cpu As Object In processors
            cpu_ids = cpu_ids & ", " & cpu.ProcessorId
        Next cpu
        If cpu_ids.Length > 0 Then cpu_ids = cpu_ids.Substring(2)

        Return cpu_ids
    End Function
End Class
CpuId函数稍微复杂一点,因为您希望设置模拟标志,但仍然可以围绕WMI接口的网络包装器类编写方法

Private Function SystemSerialNumber(computer As String) As String

    Dim wmi = New ManagementObjectSearcher(computer & "\root\cimv2", "select * from Win32_BaseBoard")

    Dim boards = New List(Of String)()
    For Each board In wmi.Get()
        Dim temp = board.Properties("SerialNumber").Value?.ToString()
        If Not String.IsNullOrEmpty(temp) Then
            boards.Add(temp)
        End If
    Next board
    Return String.Join(", ", boards)
End Function

您是否尝试更改GetObject并使用ManagementObjectSearcher及其类?我甚至不理解它的含义顺便说一句,wmi的类型是com对象。是否有一个包装器类,我可以在其中执行ctype?这就是你的意思吗?你是否尝试更改GetObject并使用ManagementObjectSearcher及其类?我甚至不理解它的含义顺便说一句,wmi的类型是com对象。是否有一个包装器类,我可以在其中执行ctype?这就是你的意思吗?