windows - 64 位应用程序的应用程序清单
问题描述
我创建了一个 64 位 Windows 应用程序,并希望包含一个应用程序清单。
我比较了其他供应商的几个 DLL,例如 shell32.dll ,发现他们将值 "x86" 设置为processorArchitecture
; 例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
name="...."
processorArchitecture="x86"
version="...."
type="win32"/>
<description>....</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
我的问题:
64 位应用程序获得带有 processorArchitecture="x86" 的清单真的可以吗?
微软对处理器架构的描述如下:
指定处理器。对于 32 位 Windows,有效值为 x86,对于 64 位 Windows,有效值为 ia64。可选的。
这让我很困惑。为什么没有列出 amd64 / x86-64?我有一个 64 位 Windows,但我没有 Intel Itanium 架构。
2021 年 7 月编辑:Microsoft 已更新说明。新的描述是:“指定处理器。有效值包括 x86、amd64、arm 和 arm64。可选。”
根据清单,我的 64 位应用程序依赖于带有 processorArchitecture="x86" 的“Microsoft.Windows.Common-Controls”可以吗?如果我的应用程序“使用”像 comctl32.dll 这样的 DLL 来显示控件,我认为它必须是相同的架构,因为 64 位无法在没有 thunk 的情况下绑定 32 位。
编辑:事实证明我犯了一个错误:我使用工具“Resource Hacker”查看了 DLL,这是一个 32 位应用程序,所以我通过 SysWOW64 看到了 32 位 DLL,同时假设它是 64 位 DLL . processorArchitecture="amd64"
正如预期的那样,真正的 64 位 DLL 包含.
解决方案
processorArchitecture
Windows 10 不会检查标识您的应用的属性。您可以省略它。
该属性必须在dependentAssembly
元素下具有正确的值。但是,为了简单起见,您可以使用processorArchitecture="*"
。
如果要明确,amd64
是 x86-64 架构的正确值。仅记录ia64
显然是 Microsoft 文档中的一个遗漏。我已经提交了一个拉取请求来纠正这个问题。
shell32.dll
amd64
在我的 Windows 10 副本中指定。
推荐阅读
- git - git merge -no-ff 传输提交历史,但不传输内容
- docker - 这是谷歌云构建错误吗?还是我做错了 Docker?
- angular - 如何使用最新的角度和离子版本创建离子角度启动器应用程序?
- javascript - 使用另一个对象的键从对象数组创建新数组
- javascript - 使用 Http 状态代码验证正确的 URL
- google-cloud-platform - 以编程方式/使用 PHP API 的项目的 Active Cloud Firestore 数据库
- installshield - 如何签署可以在任何地方运行的 exe 或 msix 安装程序
- scala - Deciding number of parameter to pass to a method "dynamically"
- amazon-web-services - Commands in .ebextensions fails on ElasticBeanstalk
- javascript - Angular ngmodel ignores value attribute in a form input