65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 和 .NET 获取硬件配置

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.18/5 (5投票s)

2016年10月25日

CPOL

2分钟阅读

viewsIcon

14188

downloadIcon

222

枚举系统功能

引言

我一直想知道诊断应用程序是如何获取有关我的系统的信息的。

背景

我正在编写一个应用程序,它加载并使用 JPG 文件进行比较,并最终用于进一步处理。 如果我不得不一遍又一遍地加载文件,性能会受到很大影响,所以我开始为我的 JPG 文件编写一个缓存应用程序。 这个应用程序应该尽可能多地使用内存空间,而不会(如果可能)强制系统使用硬盘上的虚拟空间。 所以我的首要任务是找出当前计算机中安装了多少内存。

在我的研究过程中,我找到了获取有关已安装硬件、主板、设备的各种信息的必要方法。 由于我发现文档不太容易理解,因此我想现在与社区分享我的结果。

Using the Code

一切都始于“ManagementClass”,它使用系统定义的类名(例如,“Win32_PhysicalMemory”)。 此类名称用于创建请求数据的管理路径。 系统包含大量的类名,全部列在此处

ManagementClass MgmtClass = new ManagementClass(new ManagementPath("Win32_PhysicalMemory"));

此类中的信息项不能直接读出;我们必须创建一个对象集合

ManagementObjectCollection MOC = MgmtClass.GetInstances();

一个管理类可能具有多个实例,例如,在读取有关内存库的信息时。 我的计算机系统的主板在所有四个内存库中都配备了 RAM,因此我将获得管理类“Win32_PhysicalMemory”的四个实例以及管理对象集合中相同数量的项目。

现在可以使用两个嵌套的枚举获得所有内存管理实例的所有信息对象的完整列表。 外部枚举涵盖管理类的实例; 内部枚举返回所有信息项目及其内部名称和值。 虽然必须使用枚举器完成外部枚举,但我们可以使用 foreach 循环进行内部枚举

ManagementObjectCollection.ManagementObjectEnumerator MOE = MOC.GetEnumerator();
while (MOE.MoveNext()) {
  ManagementBaseObject mbo = MOE.Current;
  PropertyDataCollection pdc = mbo.Properties;
  foreach (PropertyData pd in pdc) {
    object value = pd.Value;
    if (value == null) continue;
    // ----- convert value object to a string
    // ----- attention: values may appear as arrays, boxed in a single object
    //  .....
  }
}

就是这样。 可以在随附的 ZIP 文件中找到此硬件功能枚举的完整代码,该文件包含编译和运行代码的所有 VS2015 文件。

注意:源包含三个额外的代码块,这些代码块是我编写的,用于获取更专业的计算机信息。 由于演示应用程序不需要这些块,因此已将其注释掉。

历史

  • 2016-10-25:初始版本
© . All rights reserved.