无法在Dot Net Core中使用System.Management.dll

32

如果 System.Management.dll 不兼容Dot Net Core,我该如何收集硬件信息。

如何获取计算机信息,例如处理器ID、磁盘卷号等。


你需要先定义你正在交互的机器,然后尝试调用相应信息的本地调用(对于Windows机器来说是PInvokes)。 - Karolis Kajenas
为了解决这个问题,我将其制作成NuGet包并安装到新项目中。但是它无法识别命名空间,也无法使用类。它显示构建错误。 - user2449952
3
目前还不可能,我已经在它们的代码库创建了一个问题,最近也有一些活动。https://github.com/dotnet/corefx/issues/3324#issuecomment-262651454 - Louis Lewis
这里是跟踪您问题的线程 https://github.com/dotnet/corefx/issues/14762 - Ivan Zaruba
5个回答

30

.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..."

有关该错误的更多信息,请参见此链接


4
System.Management仍然不支持跨平台,在Windows上可以使用,但在Unix环境下无法使用。 - Sabri Meviş
2
.Net Core版本:https://www.nuget.org/packages/System.Management/ - Legends

7

我正在移植一个使用 System.Management 来获取硬件信息的 .Net Framework 项目,但是我遇到了一个死胡同,因为 System.Management 不兼容 .Net Core。

我找到的解决方法是使用来自 System.DiagnosticsProcess.Start 执行 powershell 命令来获取该信息。例如,要获取主板序列号,可以使用命令 Get-WmiObject Win32_BaseBoard | select SerialNumber,然后您可以更改命令以处理输出并仅具有序列号,或者甚至以编程方式处理输出。

您还可以添加一些 ifs,根据当前操作系统,您可以向 Process.Start 提供特定于操作系统的命令。例如,对于 linux,您需要处理与 dmidecode 相关的命令。

这种方法唯一的负面影响是速度非常慢,与 System.Management 相比较。


这仍然是2020年在不同平台上工作时的最佳解决方案,这很遗憾。根据您运行的操作系统使用Process.Start CLI,并在重定向的输出中解析结果并返回它以及按需处理。 - ScottN
你安装了 Microsoft.Windows.Compatibility 吗? - Kiquenet
是否指的是 NuGet 包 https://www.nuget.org/packages/System.Management/ ? - Kiquenet

5

您需要在.Net Core项目中安装Microsoft.Windows.Compatibility,才能引用System.Management.dll


2
Nuget包https://www.nuget.org/packages/System.Management/和Microsoft.Windows.Compatibility也需要吗? - Kiquenet

1
我在从.NetFramework升级到.NetCore 3.0时遇到了这个问题。

.NetFramework兼容的System.Management在dotnet core上无法工作,因此为了解决这个问题,只需添加一个.Net Core兼容的System.Management nuget包。

此时可用的最新版本是4.6.0 https://www.nuget.org/packages/System.Management/4.6.0,最新预览版是4.7.0-preview3.19551.4。

1
5.0.0 https://www.nuget.org/packages/System.Management/ - 使用 NuGet 3.x 时,此软件包要求至少版本 3.4. - Kiquenet

0
这对我有用:
dotnet add package System.Management --version 8.0.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接