找回密码
 立即注册
首页 业界区 业界 记录.Net 8 发布增加 PublishTrimmed 裁剪选项,调用WMI ...

记录.Net 8 发布增加 PublishTrimmed 裁剪选项,调用WMI 的ManagementObject 异常

笃迩讦 2025-6-16 20:00:04
最近在做OTA的功能,需要获取到sn做一些业务的逻辑。我们自己实现的库里边的,大部分都是调用 System.Management 的 ManagementObjectSearcher 获取 Bios 的序列号
如下所示:
  1. private void BtnWmi_OnClick(object sender, RoutedEventArgs e)
  2. {
  3.      try
  4.      {
  5.          // 创建 WMI 查询
  6.          ManagementObjectSearcher searcher = new ManagementObjectSearcher(
  7.              "SELECT SerialNumber FROM Win32_BIOS");
  8.          // 遍历查询结果
  9.          foreach (ManagementObject obj in searcher.Get())
  10.          {
  11.              string serialNumber = obj["SerialNumber"]?.ToString();
  12.              if (!string.IsNullOrEmpty(serialNumber))
  13.              {
  14.                  Console.WriteLine($"BIOS 序列号: {serialNumber}");
  15.                  return;
  16.              }
  17.          }
  18.          Console.WriteLine("未找到 BIOS 序列号信息");
  19.      }
  20.      catch (ManagementException ex)
  21.      {
  22.          Console.WriteLine($"WMI 查询错误: {ex.Message}");
  23.      }
  24.      catch (Exception ex)
  25.      {
  26.          Console.WriteLine($"WMI 查询异常错误: {ex.Message}");
  27.      }
  28. }
复制代码
 
由于我们项目现在新建的项目都是基于.Net 8 开发,而且为了兼容多种设备和系统,我们目前的打包方式都是以发布独立部署的方式
1.png

 
同时为了能减少输出文件的大小,我们会启用裁剪的方式   true
2.png
  1.   <PublishTrimmed>true</PublishTrimmed>
  2.   <_SuppressWpfTrimError>true</_SuppressWpfTrimError>
  3.   <BuiltInComInteropSupport>true</BuiltInComInteropSupport>
  4.   <TrimMode>partial</TrimMode>
复制代码
 
以上准备工作做好,发布以上的程序,运行发现如下的错误:
3.png

 
 
查询了官网的资料,有如下的说明:剪裁选项 - .NET | Microsoft Learn
就是启用裁剪会禁用掉某些框架的功能。
 
解决方法:
参考:使用 C# 远程连接到 WMI - Win32 apps | Microsoft Learn
使用 Microsoft.Management.Infrastructure 的 CimSession 替换WMI 早期的版本
如下所示:
  1. using Microsoft.Management.Infrastructure;
  2. private void BtnCim_OnClick(object sender, RoutedEventArgs e)
  3. {
  4.      try
  5.      {
  6.          // 创建本地CIM会话
  7.          using (var session = CimSession.Create(null))
  8.          {
  9.              // 查询Win32_BIOS类
  10.              var instances = session.QueryInstances(@"root\cimv2", "WQL", "SELECT SerialNumber FROM Win32_BIOS");
  11.              foreach (var instance in instances)
  12.              {
  13.                  var serialNumber = instance.CimInstanceProperties["SerialNumber"].Value?.ToString();
  14.                  Console.WriteLine($"BIOS 序列号: {serialNumber}");
  15.              }
  16.          }
  17.      }
  18.      catch (Exception ex)
  19.      {
  20.          Console.WriteLine($"错误: {ex.Message}");
  21.      }
  22. }
复制代码
 
不修改发布选项的情况下,运行如下:是可以获取得到Bios的sn的
4.png

 
 
 
 
总结:
1、推荐使用 Microsoft.Management.Infrastructure 的 CimSession 替换 WMI 旧版的 ManagementObject
2、裁剪的选项 PublishTrimmed 如果不介意应用程序的一点体积,是可以忽略不加
 
参考:
1、剪裁选项 - .NET | Microsoft Learn
2、为应用程序部署创建单个文件 - .NET | Microsoft Learn
3、使用 C# 远程连接到 WMI - Win32 apps | Microsoft Learn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册