Windows 8.1版本在未提升时返回6.2(Win 8.0),但在提升时返回6.3(Win 8.1)。为什么?

时间:2015-01-14 16:22:37

标签: c# .net windows winapi

当我作为普通(非管理员)帐户运行时,在Windows 8.1上运行的C#应用​​程序中调用Environment.OSVersion.Version返回6.2(这是Windows 8),当我以管理员身份运行时,返回6.3(Windows 8.1)。

我的清单确实包含了根据本文http://msdn.microsoft.com/en-us/library/windows/desktop/dn481241%28v=vs.85%29.aspx的Windows 8.1兼容性,但是当我使用提升的权限运行时,我只能获得正确的版本号。知道为什么吗?

我的清单:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
        <!-- Windows 8.1 -->
        <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        <!-- Windows Vista -->
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        <!-- Windows 7 -->
        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        <!-- Windows 8 -->
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>

        <!--Windows 10 - add once tested-->
        <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>-->
    </application>
  </compatibility>   
</asmv1:assembly>

版本号:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx

类似的问题:

Why OS.Version reports Windows 8.0 for Windows 8.1?

How can I detect Windows 8.1 in a Desktop application

好的 - 也许我可以缩小这个问题。如果我从附带调试器的Visual Studio运行我的应用程序,我会看到这个问题(即报告6.2 = Windows 8)。但是,如果我在没有调试的情况下启动应用程序(没有vshost),那么我没有看到问题(即报告6.3 = Windows 8.1)。

清单是否构建在我的应用程序的exe中的问题,但执行过程是vshost包装器,它没有报告与Windows 8.1兼容的清单?这对我来说很有意义,但这是奇怪的行为。它实际上意味着在调试app.manifest文件时没用。

1 个答案:

答案 0 :(得分:1)

我找不到Microsoft的任何支持证据,但是在使用和不使用托管进程的情况下调试我的应用程序会导致不同的行为。我的结论是托管过程有自己的清单,这与您的应用程序的清单不同。因此,操作系统不会“看到”至少一些清单设置,例如操作系统兼容性。