【问题标题】:Not able to use System.Management.dll in Dot Net Core无法在 Dot Net Core 中使用 System.Management.dll
【发布时间】:2016-11-12 20:59:39
【问题描述】:

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

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

【问题讨论】:

  • 猜你必须定义你正在与之交互的机器,然后尝试调用本机调用来获取这些信息(PInvokes for win 机器)。
  • 对于解决方法,我将其设置为安装在新项目中的 nuget 包,但它无法识别命名空间。无法使用类。它显示构建错误
  • 目前不可能,我在他们的 repo 上创建了一个问题,最近有一些活动。 github.com/dotnet/corefx/issues/3324#issuecomment-262651454
  • 这是跟踪您的问题的线程github.com/dotnet/corefx/issues/14762

标签: c# asp.net-core .net-core


【解决方案1】:

.NET Core 3 现在支持 System.Management。目前,.NET Core 3 处于预览模式,预览 4 是最新的。

您必须选择 Visual Studio 中项目菜单下的 管理 NuGet 包... 菜单项来安装最新版本的 System.Management。确保选中 include previews 复选框,以便安装最新版本。

上一版System.Management报错:

“无法使用 [Out] 属性封送字符串按值...”

有关错误的详细信息,请参阅this link

【讨论】:

【解决方案2】:

我目前正在移植一个使用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慢了很多。

【讨论】:

  • 这仍然是 2020 年在不同平台上工作时最好的解决方法,这是一个耻辱。 Process.Start CLI 取决于您正在运行的操作系统,并在重定向的输出中解析结果并根据需要返回和处理。
  • 你安装了 Microsoft.Windows.Compatibility 吗?
【解决方案3】:

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

【讨论】:

【解决方案4】:

我在从 .NetFramework 升级到 .NetCore 3.0 时发现了这个问题

.NetFramework 兼容 System.Management 不适用于 dotnet 核心,因此要解决此问题,只需添加一个 .Net 核心兼容 System.Management nuget。

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

【讨论】:

猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2020-08-09
  • 2021-02-21
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多