首先,我想感谢您帮助我解决这个问题.我非常感谢你的时间和努力.
标题总结得很好但是我会提供一些细节.基本上,如果我使用C#获取操作系统版本,它将返回结果6.2,即使我的系统是8.1,它应该返回6.3.在我的研究之后,我发现这是System.Enviroment类中的文档限制,...必须喜欢那些"功能".
通过进入reg并将我的6.2结果与HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion下的当前版本密钥进行比较,我找到了解决这个问题的方法.但是,这是一个非常冒险的操作,因为reg信息可能会更改,恕不另行通知.
当我试图通过Powershell进行WMI调查时,这一切都变得棘手了.我不记得为什么我通过Powershell进行了WMI搜索,我猜它不仅仅是那些好奇的猫:)
C#代码:
string version = Environment.OSVersion.ToString();
MessageBox.Show(version);
//Output "Microsoft Windows NT 6.2.9200.0"
Run Code Online (Sandbox Code Playgroud)
Powershell代码:
[System.Environment]::OSVersion | Select-Object -Property VersionString
//OUtput "Microsoft Windows NT 6.3.9600.0"
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我的C#程序的x86和x64版本,以及运行Powershell x86和x64.差异没有改变.
这给我提出了几个问题,但基本的问题是Powershell从哪里获得正确的信息?Powershell是否像我原先计划的那样使用reg来修复输出?由于我的构建目标.Net 3.5做Powershell拉.Net 4.5(改变我的构建,这没有改变).
从我的理解[System.Environment] :: OSVersion拉取信息与System.Environment.OSVersion相同.
Powershell如何工作和C#失败?
:) 再次感谢!
据我所知,只有Environment.VersionC# 程序中的调用是不正确的(6.2)。在 PowerShell 中它是正确的 (6.3)。在通过 PowerShell 或 C# 调用的 WMI 中,它是正确的。事实上,C# 在 PowerShell 中使用Add-Type返回 6.3 从源代码编译。
查看此处的文章(感谢 Booga Roo),它表明除非您的应用程序通过清单文件明确表示它以 Windows 8.1 为目标,否则您将获得旧版本 (6.2)。
您可以通过添加应用程序清单文件并取消注释该行来声明 8.1 支持,从而使 C# 应用程序返回正确的版本
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
Run Code Online (Sandbox Code Playgroud)
似乎可以放心地假设 Microsoft 的 PowerShell 编写者在 powershell.exe 中包含了一个应用程序清单,声明了 Windows 8.1 支持。