【问题标题】:Windows 8.1 version returned as 6.2 (Win 8.0) when not elevated, but 6.3 (Win 8.1) when elevated. Why?Windows 8.1 版本在未提升时返回为 6.2 (Win 8.0),但在提升时返回为 6.3 (Win 8.1)。为什么?
【发布时间】:2015-01-14 16:22:37
【问题描述】:

当我以普通(非管理员)帐户运行时,在 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)。

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

【问题讨论】:

  • 你能出示你的清单吗?
  • 尝试在构建选项中关闭托管选项
  • 是的,这确实有效,我仍然可以调试应用程序。那么托管过程的意义何在?

标签: c# .net windows winapi


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2016-01-23
    • 2013-11-01
    相关资源
    最近更新 更多