Vb.net 我们如何使这段代码在选项严格的情况下运行?
此代码将检索CPU id和主板id。如何确保即使在启用option strict时也能正常工作 为什么这会成为一个问题 好吧,让我想想。wmi的类型是对象。wmi不一定支持InstancesOf和SerialNumber等方法 那我们怎么才能把它拔出来呢 我认为我们从GetObject得到的对象不仅仅是纯对象。我认为我们应该使用ctype或直接将其转换为更合适的类型。更合适的类型将支持InstancesOf、SerialNumber等方法 但是,适当的类型是什么?您可以从System.Management.dll程序集中托管的WMI类使用。Vb.net 我们如何使这段代码在选项严格的情况下运行?,vb.net,Vb.net,此代码将检索CPU id和主板id。如何确保即使在启用option strict时也能正常工作 为什么这会成为一个问题 好吧,让我想想。wmi的类型是对象。wmi不一定支持InstancesOf和SerialNumber等方法 那我们怎么才能把它拔出来呢 我认为我们从GetObject得到的对象不仅仅是纯对象。我认为我们应该使用ctype或直接将其转换为更合适的类型。更合适的类型将支持InstancesOf、SerialNumber等方法 但是,适当的类型是什么?您可以从System.Manag
(您需要添加适当的引用) 通过这种方式,您可以将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?这就是你的意思吗?