VB.NET中My.Computer.Info.OSFullName抛出System.Exception的根因咨询
根本原因分析及验证方案
针对你遇到的My.Computer.Info.OSFullName在部分Windows 10设备抛出异常的问题,以下是几种可能的根本原因及对应的验证/排查方向:
1. Windows系统信息注册表项损坏或权限异常
My.Computer.Info.OSFullName本质是读取Windows注册表中HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion路径下的ProductName和EditionID等键值组合生成系统全名。如果这些注册表项:
- 被恶意软件、错误的系统优化工具篡改/删除
- 当前应用运行的用户权限不足以读取该注册表分支(比如用户是标准权限,而注册表项权限被修改)
就会触发异常。
验证方法:
- 在出问题的设备上,打开注册表编辑器(
regedit.exe),导航到上述路径,检查ProductName、EditionID等键是否存在且有正常值(比如Win10专业版的ProductName应为Windows 10 Pro) - 右键该注册表项,选择「权限」,确认当前用户有「读取」权限。
2. .NET Framework 4.5运行时损坏或部分组件缺失
虽然应用在其他设备正常,但个别设备的.NET Framework 4.5可能因系统更新失败、磁盘错误、第三方软件干扰导致运行时组件损坏,使得My.Computer.Info相关的类无法正常工作。
验证方法:
- 在出问题的设备上运行.NET Framework修复工具,扫描并修复可能的损坏
- 检查系统事件查看器中的「应用程序」日志,是否有.NET Framework相关的错误记录。
3. Windows 10系统版本或更新补丁异常
部分Windows 10的特定版本(比如旧版本未更新)或安装了有问题的累积更新补丁,可能导致系统API返回异常,进而让My.Computer.Info.OSFullName解析失败。
验证方法:
- 对比出问题设备和正常设备的Windows 10版本号(设置-系统-关于里查看),确认是否存在版本差异
- 检查出问题设备的更新历史,是否有安装后出现异常的补丁,尝试卸载该补丁后测试。
4. 应用程序权限或运行环境限制
如果应用是在受限制的环境(比如域管控设备、启用了UAC严格模式、或被杀毒软件/EDR工具拦截)下运行,可能导致读取系统信息的操作被阻止,触发异常。
验证方法:
- 右键应用程序,选择「以管理员身份运行」,测试是否还会抛出异常
- 临时关闭杀毒软件/EDR工具,再次运行应用,排查是否被拦截。
替代方案(无需依赖My.Computer.Info)
如果暂时无法定位根本原因,也可以直接调用Windows API读取系统信息,避免依赖.NET封装的类:
Imports System.Runtime.InteropServices Public Class OSInfo <DllImport("kernel32.dll")> Private Shared Function GetVersionEx(ByRef lpVersionInformation As OSVERSIONINFOEX) As Boolean End Function <StructLayout(LayoutKind.Sequential)> Private Structure OSVERSIONINFOEX Public dwOSVersionInfoSize As Integer Public dwMajorVersion As Integer Public dwMinorVersion As Integer Public dwBuildNumber As Integer Public dwPlatformId As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String Public wServicePackMajor As Short Public wServicePackMinor As Short Public wSuiteMask As Short Public wProductType As Byte Public wReserved As Byte End Structure Public Shared Function GetOSFullName() As String Dim osInfo As New OSVERSIONINFOEX() osInfo.dwOSVersionInfoSize = Marshal.SizeOf(osInfo) If GetVersionEx(osInfo) Then ' 根据版本号和ProductType判断系统版本 If osInfo.dwMajorVersion = 10 AndAlso osInfo.dwMinorVersion = 0 Then Select Case osInfo.wProductType Case 1 ' 工作站版 ' 读取注册表获取Edition Dim edition As String = My.Computer.Registry.GetValue("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "EditionID", "Unknown").ToString() Return $"Windows 10 {edition}" Case 2 ' 域控制器 Return "Windows 10 Server (Domain Controller)" Case 3 ' 服务器版 Return "Windows 10 Server" End Select End If End If Return "Unknown OS" End Function End Class
然后在代码中调用ThisOS.Text = OSInfo.GetOSFullName(),这种方式更直接,减少.NET封装层的潜在问题。
内容的提问来源于stack exchange,提问作者Ray E
相关产品推荐
相关产品推荐

