如果 System.Management.dll
不兼容Dot Net Core,我该如何收集硬件信息。
如何获取计算机信息,例如处理器ID、磁盘卷号等。
如果 System.Management.dll
不兼容Dot Net Core,我该如何收集硬件信息。
如何获取计算机信息,例如处理器ID、磁盘卷号等。
.NET Core 3现在支持System.Management。截至目前,.NET Core 3处于预览模式,最新的预览版是preview 4。
您需要在Visual Studio的项目菜单下选择Manage NuGet packages...菜单项来安装最新版本的System.Management
。确保选中了包括预览复选框,以便安装最新版本。
旧版本的System.Management
会抛出一个错误:
"Cannot marshal a string by-value with the [Out] attribute..."
有关该错误的更多信息,请参见此链接。
我正在移植一个使用 System.Management
来获取硬件信息的 .Net Framework 项目,但是我遇到了一个死胡同,因为 System.Management
不兼容 .Net Core。
我找到的解决方法是使用来自 System.Diagnostics
的 Process.Start
执行 powershell 命令来获取该信息。例如,要获取主板序列号,可以使用命令 Get-WmiObject Win32_BaseBoard | select SerialNumber
,然后您可以更改命令以处理输出并仅具有序列号,或者甚至以编程方式处理输出。
您还可以添加一些 ifs
,根据当前操作系统,您可以向 Process.Start
提供特定于操作系统的命令。例如,对于 linux,您需要处理与 dmidecode 相关的命令。
这种方法唯一的负面影响是速度非常慢,与 System.Management
相比较。
Process.Start
CLI,并在重定向的输出中解析结果并返回它以及按需处理。 - ScottN您需要在.Net Core项目中安装Microsoft.Windows.Compatibility
,才能引用System.Management.dll
。
此时可用的最新版本是4.6.0 https://www.nuget.org/packages/System.Management/4.6.0,最新预览版是4.7.0-preview3.19551.4。.NetFramework兼容的System.Management在dotnet core上无法工作,因此为了解决这个问题,只需添加一个.Net Core兼容的System.Management nuget包。