我需要检查在Windows系统上是否为64位版本或32位版本编译的可执行程序。
答案 0 :(得分:1)
我认为这个问题很难回答,因为Windows中的.NET可执行文件包含两种形式的代码:
第一部分是本机存根,它引入系统的可用运行时(对于较旧的Windows系统,当OS加载程序本身不识别CLR程序集时)。与其他Windows应用程序一样,它可以是32位或64位。您可以通过analyzing its PE header找到目标架构。
正如您所知,这很容易确定。但是,我怀疑它可能在很大程度上与您的用例(以及大多数用例)无关,因为第一部分不包含"有用的"您的计划的一部分,主要是出于遗产原因。
第二部分是IL(字节码),它将被JIT编译然后执行。这是有用的部分,但在不运行时,这在很大程度上与平台无关。它是运行时JIT生成的代码,它变为32位或64位。
现在,如果使用 x86 或 x64 配置明确构建程序集,则会将其标记为you can find out programmatically without running it whether it's going to be 32-bit or 64-bit。
但是,如果它被标记为 AnyCPU (就像现在的大多数程序集一样),您无法事先知道JIT编译代码的期望。您只能在运行时(asking the environment或comparing the size of IntPtr
for example)真正找到答案。或者您可以做出有根据的猜测 - 如果您的当前程序在32位Windows下运行(但是从非托管代码确定这可能是不可靠的),您绝对不必期望.NET程序集将生成64位CPU指令。但是,如果您在64位Windows下运行(同样是最有可能的情况),那就不那么容易了,特别是考虑到the semantics of the AnyCPU configuration changed with .NET 4.5并且您必须要考虑帐户对于那些变化也是如此。
现在,您可能已经意识到这一点:第一部分和第二部分可能不匹配。他们经常不会,因为最常见场景是使用AnyCPU配置(which will typically yield a 32-bit PE executable)构建并在64位系统上部署,其中IL将被JIT编译为64位指令。
最后,你必须具体决定你想知道哪一个(以及它是否值得这么麻烦)。您可能还想探索其他选项,例如利用AnyCPU程序集可以加载为32位或64位的事实,在许多情况下,您可以在不检查的情况下使用它们。