我需要检查Windows系统上是否为64位版本或32位版本编译了可执行程序。
我认为这个问题很难回答,因为Windows中的.NET可执行文件包含两种形式的代码:
第一部分是一个本地存根,它引入了系统的可用运行时间(对于较旧的Windows系统,当OS加载程序无法本地识别CLR程序集时)。像其他Windows应用程序一样,它可以是32位或64位。您可以通过分析其PE标头找出其目标体系结构。
如您所知,这很容易确定。但是,我怀疑它也可能与您的用例(以及大多数用例)没有太大关系,因为第一部分不包含程序的“有用”部分,并且主要是出于遗留原因。
第二部分是将进行JIT编译然后执行的IL(字节码)。这是有用的部分,但是在不运行时很大程度上与平台无关。是由运行时JIT生成的代码变为32位或64位。
现在,如果该程序集是使用x86或x64配置显式构建的,则将被标记为这样,无论是32位还是64位,您都可以通过编程方式找到它而无需运行它。
但是,如果将其标记为AnyCPU(如今,就像大多数程序集一样),您将无法事先知道对JIT编译的代码会有什么期望。您只能真正找到了在运行时(通过询问环境或比较的大小IntPtr
,例如)。或者,您可以进行有根据的猜测-如果您当前的程序在32位Windows下运行(但是从非托管代码确定这一点可能不可靠),则您绝对不必期望.NET程序集会生成64位CPU指示。但是,如果您在64位Windows(同样是最有可能的情况)下运行,就不会那么容易,尤其是考虑到.NET 4.5中AnyCPU配置的语义已更改时 而且您还必须考虑这些更改。
现在,这是您可能已经意识到的问题:第一部分和第二部分可能不匹配。而且它们通常不这样做,因为最常见的情况是使用AnyCPU配置(通常会生成32位PE可执行文件)构建并部署在64位系统上,其中IL将JIT编译为64位指示。
最后,您必须具体确定要知道的两个(以及是否值得解决)。您可能还需要探索其他选项,例如利用AnyCPU程序集可以32位或64位加载的事实,并且在许多情况下,无需检查即可使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句