从app.manifest C#瞄准Win 10

时间:2015-09-01 16:11:06

标签: c# windows manifest

爵士 我试图用C#中的app.manifest来定位Win 10但是,它似乎无法正常工作。

app.manifest

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v1">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
             If you want to change the Windows User Account Control level replace the 
             requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Specifying requestedExecutionLevel element will disable file and registry virtualization. 
            Remove this element if your application requires this virtualization for backwards
            compatibility.
        -->
        <requestedExecutionLevel level="highestAvailable" uiAccess="true" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- A list of the Windows versions that this application has been tested on and is
           is designed to work with. Uncomment the appropriate elements and Windows will 
           automatically selected the most compatible environment. -->

      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />

      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />

      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />

      <!-- Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
    </application>
  </compatibility>
  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df"
        language="*" />
    </dependentAssembly>
  </dependency>
</assembly>

返回的Environment.OSVersion.Version仍为v6.2。

此外,我想知道在哪里包括

  

_NT_TARGET_VERSION = $(_NT_TARGET_VERSION_LATEST)

2 个答案:

答案 0 :(得分:0)

如果您使用Visual Studio构建,则清单应自动编译到EXE中。如果没有发生这种情况,请从项目中删除清单并重新添加。这是详细的in this similar question

如果您使用其他工具链构建,mt.exe(可作为Windows SDK的一部分提供)可用于注入清单。

或者,如果您的应用程序没有嵌入式清单,则可以将清单包含为附加文件。只需修改清单中的应用程序名称以匹配您的可执行文件,然后将清单文件本身重命名为

<application>.exe.manifest

并将其放在与可执行文件相同的目录中。但是,建议嵌入清单。

请注意,清单会在首次运行时缓存;更新EXE上的时间戳或重新启动计算机将导致下次启动应用程序时重新加载清单。

答案 1 :(得分:0)

现在是RtlGetVersion,大家好! : - )

https://msdn.microsoft.com/en-us/library/windows/hardware/ff561910%28v=vs.85%29.aspx

不,但这通常不是必需的,真的!阅读版本应该使用适当的清单,并且MS不会试图阻止所有GetVersion / GetVersionEx调用。 您是否已使用mt.exe进行检查,是否清单合并了清单? (我还没有尝试过Environment.OSVersion.Version,但也许这仍然是个bug?)

如果某人激活了应用的兼容模式,即使RtlGetVersion版本错误。

问题是,如果你没有干净的Win 10清单,可能会发生兼容性辅助将定义一些程序(例如看起来像设置,安装等类似的程序)作为遗产并用兼容性标记标记它们。奇怪的解决方案(不是新的,自Win 7以来是一样的,我看到很多人因此而哭泣); - )。

要重复使测试Windows版本更加困难的想法:太多的开发人员滥用API并阻止了他们还不知道的Windows版本的应用程序。然后用户指责Windows不兼容.. 这是一个非常大的错误,因为Y2K问题很难在多年后测试和发现。 除了经过认证的软件,例如对于核熔毁,通常只允许在经过认证的硬件上使用,对未来版本的测试永远不应该阻止该应用程序!

测试Windows版本当然仍然可以对已知的Windows不兼容性和不同的功能集做出反应。

理论上,清单解决方案应该克服上述问题,因为只有“知道”Windows版本(密钥)的人才能测试正确的版本。