如何确定.NET程序集是为x86还是x64构建的?
我有一个.NET程序集的任意列表。
我需要以编程方式检查每个DLL是否为x86构建(而不是x64或任何CPU)。 这可能吗?
看看System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
您可以从返回的AssemblyName实例中检查程序集元数据:
使用PowerShell :
[36] C:> [reflection.assemblyname]::GetAssemblyName("${pwd}Microsoft.GLEE.dll") | fl Name : Microsoft.GLEE Version : 1.0.0.0 CultureInfo : CodeBase : file:///C:/projects/powershell/BuildAnalyzer/... EscapedCodeBase : file:///C:/projects/powershell/BuildAnalyzer/... ProcessorArchitecture : MSIL Flags : PublicKey HashAlgorithm : SHA1 VersionCompatibility : SameMachine KeyPair : FullName : Microsoft.GLEE, Version=1.0.0.0, Culture=neut...
这里,ProcessorArchitecture标识目标平台。
我在本例中使用PowerShell来调用该方法。
您可以使用CorFlags CLI工具(例如,C: Program Files Microsoft SDKs Windows v7.0 Bin CorFlags.exe)来确定程序集的状态,并根据其输出结果打开程序集二元资产,您应该能够确定您需要查找的位置,以确定32BIT标志是设置为1(x86)还是0(取决于PE
任何CPU或x64):
Option | PE | 32BIT
----------|-------|---------
x86 | PE32 | 1
Any CPU | PE32 | 0
x64 | PE32+ | 0
使用.NET开发的博客帖子x64开发了一些关于corflags
信息。
更好的是,您可以使用Module.GetPEKind
来确定程序集是否为PortableExecutableKinds
值PE32Plus
(64位), Required32Bit
(32位和WOW)或ILOnly
(任何CPU)以及其他属性。
为了澄清,CorFlags.exe是.NET Framework SDK的一部分。 我的机器上有开发工具,而确定一个DLL是否只有32位的最简单方法是:
打开Visual Studio命令提示符(在Windows中:菜单开始/程序/ Microsoft Visual Studio / Visual Studio工具/ Visual Studio 2008命令提示符)
CD到包含有问题的DLL的目录
像这样运行corflags: corflags MyAssembly.dll
你会得到这样的输出:
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 3.5.21022.8
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 3
ILONLY : 1
32BIT : 1
Signed : 0
根据评论意见,上述标志的内容如下:
上一篇: How to determine if a .NET assembly was built for x86 or x64?