检查服务在Windows上安装为64位还是32位

本文关键字:64位 32位 安装 服务 Windows 检查 | 更新日期: 2023-09-27 18:17:29

我需要检查在Windows系统上编译的可执行程序是64位版本还是32位版本。

检查服务在Windows上安装为64位还是32位

我认为这个问题很难回答,因为Windows中的。net可执行文件包含两种形式的代码:

第一部分是一个本地存根,它引入了系统可用的运行时(对于较旧的Windows系统,当操作系统加载程序不能本地识别CLR程序集时)。它可以是32位或64位,就像其他Windows应用程序一样。您可以通过分析它的PE头来找到它的目标体系结构。

可以看出,这很容易确定。然而,我怀疑它也可能与您的用例(以及大多数用例)在很大程度上无关,因为这第一部分不包含您的程序的"有用"部分,并且主要是出于遗留原因。

第二部分是IL(字节码),它将被jit编译并执行。这是有用的部分,但在不运行时,这在很大程度上与平台无关。是运行时jit生成的代码变成了32位或64位。

  • 现在,如果程序集是使用x86x64配置显式构建的,它将被标记为这样,您可以在不运行它的情况下以编程方式发现它是32位还是64位。

  • 然而,如果它被标记为AnyCPU(就像大多数程序集一样,这些天),您无法事先知道jit编译的代码会发生什么。您只能在运行时(例如,通过询问环境或比较IntPtr的大小)才能真正找到答案。或者您可以做一个有根据的猜测——如果您的当前程序在32位Windows下运行(但是从非托管代码中确定这一点可能是不可靠的),您肯定不必期望. net程序集会生成64位CPU指令。然而,如果你在64位Windows下运行(再次,最有可能的情况),这不会那么容易,特别是考虑到AnyCPU配置的语义在。net 4.5中发生了变化,你也必须考虑这些变化。

现在,这里有一个您可能已经意识到的问题:第一部分和第二部分可能不匹配。它们通常不这样做,因为最常见的场景是使用AnyCPU配置(通常会产生一个32位的PE可执行文件)构建并部署在64位系统上,其中IL将被jit编译为64位指令。

最后,你必须明确地决定你想知道这两者中的哪一个(以及是否值得这么麻烦)。您可能还想探索其他选项,例如利用AnyCPU程序集可以以32位或64位加载的事实,并且在许多情况下,您可以不检查就使用它们。